指针运算(指针运算很容易产生野指针)
指针里面就存的是一个整数
指针+整数(void*不行)
#include<stdio.h> #include<stdlib.h> int main(){ char* p = (char*)0x100;/*野指针,但只要不解引用就没事*/ printf("%p\n", p+1); int* t = (int*)0x200; printf("%p\n", t + 1); system("pause"); return 0; }
指针+1相当于地址向后跳过一个元素,
看指针的类型,如果是char,地址+1;
如果是short类型,地址+2;如果是int类型,地址+4;
#include<stdio.h> #include<stdlib.h> int main(){ int arr[4] = { 1, 2, 3, 4 }; int* p = &arr[0]; printf("%d\n", arr[1]); printf("%d\n", *(p+1)); printf("%d\n", p[1]); system("pause"); return 0; }
扩展:
1.数组作为函数参数时会隐式转为指针
2.数组名直接printf打印也会隐式转为指针
3.数组名参与算术运算也会隐式转为指针
4.*(p+1)和p[1]等价,可以理解成p[1]是*(p+1)的简化
指针-指针(void*不行)(不能指针+指针)
#include<stdio.h> #include<stdlib.h> int main(){ int arr[4] = { 1, 2, 3, 4 }; int* p1 = &arr[0]; int* p2 = &arr[2]; int ret = p2 - p1; printf("%p %p\n", p1, p2); printf("ret=%d\n", ret); system("pause"); return 0; }
指针相减本质上就是算两个指针之间隔了几个元素(和指针类型相关)
指针相减其实是指针+-整数的逆运算
指针相减一般是没有意义的,要是要有意义,要满足两个条件:
1.两个指针的类型相同.
2.两个指针必须要指向同一个连续的内存空间(同一个数组,malloc)
指针的关系运算
==
!=
针对比较指针大小一般没有意义(比较地址数值大小)
要是要有意义,要满足两个条件:
1.两个指针的类型相同.
2.两个指针必须要指向同一个连续的内存空间(同一个数组,malloc)
<
<=
>
>=
扩展知识:
C语言中,比较两个字符串,有两种方式
1.==比较字符串的身份/地址(是不是同一个字符串变量)
2.strcmp比较字符串的内容(字符串里面每个字符是不是依次相同)
strcmp(str1,str2) == 0 则两个字符串相等
一般常见的编程语言中,字符串==都是在比较内存,有两个例外:
1.C语言 2.Java 是比较地址
strcmp除了能比较字符串相等之外,还能比较字符串大小.
比较规则:先看第一个字符ASCII值的大小.如果能分出大小,结果就确定了.
如果第一个字符相同,依次比较下一个字符的ASCII.
strcmp(str1,str2)
如果 str1 小于 str2 返回一个 <0 的整数
如果 str1 大于 str2 返回一个 >0 的整数
指针数组:是一个数组,数组中的每一个元素又是一个指针变量.(实用)
int* arr[4] = { 0 };
数组指针:是一个指针.(不实用)
int(*arr)[4] = NULL;
const与指针搭配时: (背下来)
const int* p 限制根据指针修改对应的内存
int const* p 限制根据指针修改对应的内存
int* const p 限制修改指针的指向
#include<stdio.h> #include<stdlib.h> int main(){ int arr[] = { 1, 2, 3, 4 }; printf("%d\n", sizeof(arr)); /*16*/ printf("%d\n", sizeof(arr+0)); /*数组名参与算术运算也会隐式转为指针,指针大小为4个字节*/ printf("%d\n", sizeof(arr+1)); /*数组名参与算术运算也会隐式转为指针,指针大小为4个字节*/ printf("%d\n", sizeof(*arr)); //得到首元素int,大小为4个字节 printf("%d\n", sizeof(&arr)); //数组指针,指针大小为4 printf("%d\n", sizeof(&arr+1)); //数组指针,指针大小为4 printf("%d\n", sizeof(*&arr)); //数组指针解引用得到数组 16 printf("%d\n", sizeof(&*arr)); //针对一个int取地址,得到一个int* 4 printf("%d\n", sizeof(&arr[0]+1)); /*int* 4*/ system("pause"); return 0; }
原文:https://www.cnblogs.com/enjoyC/p/14590534.html