C语言 指针的理解 — 2
一.字符指针int main() { const char* p1 abcdedf; const char* p2 abcdedf; if (p1 p2) { printf(p1p2\n); } else { printf(p1!p2\n); } char arr1[] abcdedf; char arr2[] abcdedf; if (arr1 arr2) { printf(arr1arr2\n); } else { printf(arr1!arr2\n); } return 0; }为什么 p1p2 解释p1 和 p2 都存放的是常量字符串的首元素的地址。它们都指向内存中只读数据区的常量字符串的首元素地址因为常量字符串不可被修改内存中只存储一个常量字符串内容来提供使用。在内存中大概是这样布局的结论p1 和p2 都存的是同一个值地址。为什么 arr1 ! arr2 解释arr1 和 arr2 存储一个字符串需要 分别 向内存申请自己的独立的空间数组名在这种情况下又是首元素地址2个不同空间的首元素地址就不相同了。在内存中大概是这样布局的结论p1 和p2 都存的是不同的值首元素地址。二.指针数组什么是指针数组指针数组用来存放指针变量的数组。int* arr1[10]; char* arr2[10];arr1数组: 存放的是 int * 类型 的 10 个元素的数组。arr2数组: 存放的是 char * 类型 的 10 个元素的数组.指针数组有什么应用场景1.二维数组的模拟实现int main() { int arr1[4] { 1,2,3,4 }; int arr2[4] { 2,3,4,5 }; int arr3[4] { 3,4,5,6 }; int* parr[3] { arr1,arr2,arr3 }; return 0; }这里的每个元素 arr[0] arr[1] arr[2] 相当于每个数组首元素地址。和二维数组不同的是这个模拟二维数组不是连续存放的在内存的大致布局parr [ i ] 等价于 * parr i int main() { int arr1[4] { 1,2,3,4 }; int arr2[4] { 2,3,4,5 }; int arr3[4] { 3,4,5,6 }; int* parr[3] { arr1,arr2,arr3 }; int i 0; for (i 0; i 3; i) { int j 0; for (j 0; j 4; j) { printf(%d , *(*(parr i) j)); } } return 0; }三.数组指针什么是数组指针数组指针指向数组的指针。和指针数组的区别int* p1[10]; int(*p2)[10];区别p1是数组名数组的元素类型 int * , 元素个数是 10。p2 和 * 一起表示p2是指针p2指向的是 10个元素类型是 int 的数组。数组指针的应用场景数组指针为了存放数组的地址。arr 取出的是整个数组的地址*p表示p是指针p指向数组的类型是char ,元素个数是20。去掉 p 就是 p 的类型 , 即 char * [ 20 ]。char arr[20] { 0 }; char(*p)[20] arr;这个又给怎么理解呢char* ch[5]; char*(*p)[5]ch;(*p表示p是指针p指向数组的类型是char *,元素个数是5。注意在写数组指针的时候不能省略指向数组的元素个数。