指针的加法、减法运算,实际上加的是一个单位,单位大小可以用sizeof(p[0])
在C语言中,可以对指针变量进行算术运算,主要有以下几种运算:
1. 针对指针的++/--运算:这会使指针的值增加或减少它所指向类型的大小。
例如对int* p:p++; // p增加4个字节
2. 针对指针的加减整数运算:
int* p = ...; p = p + 2; // p增加2 * sizeof(int) 个字节 p += 10; // p增加10 * sizeof(int) 个字节
3. 两个指针减法:
int* p1 = ...; int* p2 = ...; int n = p2 - p1; // n是p1和p2之间的元素个数
4. 指针与整数的比较:可以判断指针是否相等,或大小关系。5. 指针作为数组下标:
int arr[10]; int* p = &arr[0]; arr[2] == *(p + 2) //取指针偏移地址中的值
5.指针的标签式访问[n]
n:ID 标签
地址内容的标签式访问,p[2]可跳跃式访问到2。
在C语言中,p+2和p[2]相关但有细微区别:
1. p是一个指针,假设它的类型是T* p
2. p+2会得到一个指针的值,相当于p向后移动2个元素的位置。它的类型仍然是T*。
3. p[2]表示访问p指向数组的第2个元素,它得到的是数组中第2个元素的值,类型为T。
4. p[2]在编译器处理时会被转换为*(p+2)的形式,即先偏移指针,再解引用访问该位置的元素。
p+2是指针偏移,p[2]是数组元素访问。p+2的结果仍是个指针,而p[2]是访问元素的值
例如:
int arr[] = {1, 2, 3, 4};
int *p = arr;
int *q = p + 2; // q指向arr[2]的地址
int x = p[2]; // x的值为3