作者: Andy. 时间: 2016-03-07 14:51:17
今天上课,老师说有有很多人指针全部用指针代替。自学C,恰好前两天刚看了这儿。总结一下自己的体会~先贴代码和运算结果。再说体会~~
代码:
#include<stdio.h> #include<stdlib.h> int main(void) { { char *firstArray[] = { "a","bb","c^c" }; printf("FirstArray's size:%d\n", sizeof(firstArray)); for (int i = 0; i < 3; i++) { printf("%s\n", *(firstArray + i)); } printf("firstArray:%d\n", firstArray); printf("firstArray + 1:%d\n", firstArray + 1); printf("firstArray + 2:%d\n", firstArray + 2); printf("*(firstArray + 2)[1]:%c\n", *(*(firstArray + 2) + 1)); printf("-----------------------------------------------\n"); } { char secondArray[3][10] = { "a","bb","c^c" }; printf("secondArray's size:%d\n", sizeof(secondArray)); for (int i = 0; i < 3; i++) { printf("%s\n", *(secondArray + i)); } printf("secondArray:%d\n", secondArray); printf("secondArray + 1:%d\n", secondArray + 1); printf("secondArray + 2:%d\n", secondArray + 2); printf("*(secondArray + 2)[1]:%c\n", *(*(secondArray + 2) + 1)); printf("-----------------------------------------------\n"); } { char **threeArray = (char **)malloc(3 * sizeof(char*)); printf("threeArray's size:%d\n", sizeof(threeArray)); *threeArray = (char *)malloc(2 * sizeof(char)); *(threeArray + 1) = (char *)malloc(3 * sizeof(char)); *(threeArray + 2) = (char *)malloc(4 * sizeof(char)); sprintf(*threeArray, "%s", "a"); sprintf(*(threeArray + 1), "%s", "bb"); sprintf(*(threeArray + 2), "%s", "c^c"); for (int i = 0; i < 3; i++) { printf("%s\n", *(threeArray + i)); } printf("threeArray:%d\n", threeArray); printf("threeArray + 1:%d\n", threeArray + 1); printf("threeArray + 2:%d\n", threeArray + 2); printf("*(threeArray + 2)[1]:%c\n", *(*(threeArray + 2) + 1)); free(*(threeArray + 2)); free(*(threeArray + 1)); free(*threeArray); free(threeArray); } getchar(); }
运算结果:
PS D:\Visual Studio\Projects\C__> vim test.c PS D:\Visual Studio\Projects\C__> gcc .\test.c -std=c99 PS D:\Visual Studio\Projects\C__> .\a.exe FirstArray's size:12 a bb c^c firstArray:6422292 firstArray + 1:6422296 firstArray + 2:6422300 *(firstArray + 2)[1]:^ ----------------------------------------------- secondArray's size:30 a bb c^c secondArray:6422262 secondArray + 1:6422272 secondArray + 2:6422282 *(secondArray + 2)[1]:^ ----------------------------------------------- threeArray's size:4 a bb c^c threeArray:6762448 threeArray + 1:6762452 threeArray + 2:6762456 *(threeArray + 2)[1]:^
编译运行都没有问题哈。
firstArray是一个指针数组。包含着三个指针,这三个指针分别指向三个内存块,这三个内存块分别存储着a, bb, c^c。因为是指针数组且包含三个指针,所以firstArray的长度为12,步长为4。*(*(firstArray + 2) + 1),firstArray指向的是指针数组,所以加2后表示的是这个指针数组中的第3个指针变量,再*,得到其指针变量指向的内存块,该内存块存储着c^c。
看secondArray,直接定义了一个二维数组,存着a, bb, c^c。这个和firstArray几乎没什么区别。因为是数组,所以长度自然就为30。步长10。(firstArray + 2) + 1)的解释也是一样的~~有必要指出secondArray代表的是数组首元素的地址,而&secondArray才代表整个数组的地址。
threeArray,我用Visual Studio的时候看Memory看了一会儿才明白,果然20几岁的思维赶不上十几岁哎。分配了12个字节给threeArray(三个指针的长度),很明显就是指针数组。存储着三个指针。一下代码分配内存并将地址块的首地址分配给这三个指针。
*threeArray = (char *)malloc(2 * sizeof(char)); *(threeArray + 1) = (char *)malloc(3 * sizeof(char)); *(threeArray + 2) = (char *)malloc(4 * sizeof(char)); sprintf(*threeArray, "%s", "a"); sprintf(*(threeArray + 1), "%s", "bb"); sprintf(*(threeArray + 2), "%s", "c^c");
最后输出的结果和1、2的结果吻合。因为threeArray是指向数组的数组指针,所以size只有四个字节。
结尾的时候看到OneNote上面有点儿代码和结果,验证了一上面加粗的那句话。代码:
#include<stdio.h> #include<stdlib.h> int main(void){ typedef int (MyArray)[5]; MyArray a; for(int i = 0;i < 5;i++){ *(a + i) = i; } printf("a's size:%d\n",sizeof(a)); printf("%d %d",&a,&a + 1); }
结果:
a's size:20 6422296 6422316