目录
一、指针运算
· 指针+-整数
· 指针-指针
· 指针的关系运算
1.1 指针-1整数
下面的代码定义了一个float类型的数组,定义了一个float类型的指针变量,通过for循环,指针指向数组的第一个元素,一直到数组的最后一个元素,*vp++=0的含义是:先把vp指向的内容赋值为0,然后vp++,指向下一个元素。(其实就相当于是一个float数组的初始化)
#define N_VALUES 5 float values[N_VALUES]; float *vp; //指针+-整数;指针的关系运算 for (vp = &values[0]; vp < &values[N_VALUES];) { *vp++ = 0; }
1.2 指针-指针
指针-指针,得到的是其中间元素的个数。通过这个特点,我们可以模拟实现strlen库函数,来计算字符串的长度。
int my_strlen(char *s) { char *p = s; while(*p != '\0' ) p++; return p-s; }
1.3 指针的关系运算
for(vp = &values[N_VALUES]; vp > &values[0];) { *--vp = 0; }
代码简化 , 这将代码修改如下:
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--) { *vp = 0; }
实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
二、指针和数组
我们看一个例子:
#include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,0}; printf("%p\n", arr); printf("%p\n", &arr[0]); return 0; }
下面是运行结果:
由此可见,数组名和数组首元素的地址是一样的。
结论:数组名表示的是数组首元素的地址。但是还有2种特殊情况:
①sizeof(数组名),计算的是整个数组的大小,单位是字节。
②&数组名,这里的数组名表示整个数组,取出的是数组的地址。
那么这样写代码是可行的:
int arr[10] = {1,2,3,4,5,6,7,8,9,0}; int *p = arr;//p存放的是数组首元素的地址
既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个数组就成为可能。
例如:
#include <stdio.h> int main() { int arr[] = {1,2,3,4,5,6,7,8,9,0}; int *p = arr; //指针存放数组首元素的地址 int sz = sizeof(arr)/sizeof(arr[0]); for(i=0; i<sz; i++) { printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p+i); } return 0; }
运行结果如下:
所以p+i其实计算的就是数组arr下标为i的地址。
那我们就可以直接通过 指针来访问数组。
如下:
int main() { int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; int *p = arr; //指针存放数组首元素的地址 int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; for (i = 0; i<sz; i++) { printf("%d ", *(p + i)); } return 0; }
运行结果:
三、二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
这就是 二级指针 。
对于二级指针的运算有:
· *ppa 通过对 ppa 中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa 。
int b = 20; *ppa = &b;//等价于 pa = &b;
· **ppa 先通过 *ppa 找到 pa , 然后对 pa 进行解引用操作: *pa ,那找到的是 a .
**ppa = 30; //等价于*pa = 30; //等价于a = 30;
四、指针数组
指针数组是指针还是数组?
答案:是数组。是存放指针的数组。
数组我们已经知道整形数组,字符数组。
int arr1[5]; char arr2[6];
那指针数组是怎样的呢?
int* arr3[5];//是什么?
arr3是一个数组,有五个元素,每个元素是一个整形指针。
讲到这里,指针初阶我们已经学完,那么关于指针部分内容的详细介绍,我后面给大家一一讲解。感谢各位看官支持!