指针和数组
#include<stdio.h> int main() { int arr[5] = { 1,2,3,4,5 }; //打印地址 printf("%p\n", arr); printf("%p\n", &arr[0]); return 0; }
由此可见数组名的地址和数组首元素的地址是一样的。
结论:
数组名表示的是首元素的地址。
使用指针来访问一个数组成员。
#include<stdio.h> int main() { int arr[5] = { 1,2,3,4,5 }; //使用指针存放数组首元素的地址 int* p = arr; int sz = sizeof(arr) / sizeof(arr[0]); for (int 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的地址。
使用指针访问数组元素代码:
//通过指针来访问数组 #include<stdio.h> int main() { int arr[5] = { 1,2,3,4,5 }; 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; }
二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放就是二级指针。
代码如下:
#include<stdio.h> int main() { int a[5] = { 1,2,3,4,5 }; int b[5] = { 2,3,4,5,6 }; int c[5] = { 3,4,5,6,7 }; //二级指针管理数组的首元素的地址 int* ppa[] = { a,b,c }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 5; j++) { printf("%d ", ppa[i][j]); } printf("\n"); } return 0; }
可以看出通过二级指针的管理,对数组的打印更加的方便了。二级指针就像是二维数组一样,但是和二维数组没有必然的联系,切记不要使用二级指针存放二维数组。
指针数组
指针数组到底是指针还是数组,答案是数组。
代码如下:
#include<stdio.h> int main() { char arr1[] = "abcdef"; char arr2[] = "hello world"; char arr3[] = "cuihua"; //指针数组 char* parr[] = { arr1, arr2, arr3 }; int i = 0; for (i = 0; i < 3; i++) { printf("%s\n", parr[i]); } return 0; }
指针数组的本质还是数组。
指针的几个练习题
使用指针打印数组内容
代码如下:
#include<stdio.h> int main() { int arr[] = { 1,2,3,4,5 }; 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; }
解题思路:
- 通过int*类型的指针存放int类型的数组首元素地址;
- 通过sizeof计算数组中的数据个数;
- 通过循环遍历数组的每个元素。
写一个函数,可以逆序一个字符串的内容。
//字符串逆序 #include<stdio.h> #include<string.h> void Reverse(char* p,int sz) { char* lift = p; char* right = p + sz-1; while (lift<right) { char temp = *lift; *lift = *right; *right = temp; lift++; right--; } } int main() { char arr[] = "abcde"; int sz = strlen(arr); Reverse(arr,sz); printf("%s", arr); return 0; }