目录一、字符数组二、指针运算1.2.3.4.5.6.7.一、字符数组char arr[] abcdef; printf(%zd\n,sizeof(arr)); //单独放在sizoef内计算的是整个数组的大小为7个字节 printf(%zd\n,sizeof(arr 0)); //arr表示首元素地址arr0还是首元素地址为4/8字节 printf(%zd\n,sizeof(*arr)); //arr表示首元素地址解引用后是首元素为1个字节 printf(%zd\n,sizeof(arr[1])); //为数组的第二个元素计算第二个元素的大小为1个字节 printf(%zd\n,sizeof(arr)); //arr单独与出现代表整个数组的地址是地址就为4/8字节 printf(%zd\n,sizeof(arr 1)); //跳过1个数组后的地址但还是地址为4/8 printf(%zd\n,sizeof(arr[0] 1)); //arr[0]是首元素地址arr[0]1是数组第二个元素的地址为4/8字节7 8 1 1 8 8 8char arr[] adcdef printf(%zd\n,strlen(arr)); //arr首元素地址从第一个元素开始往后找\0统计\0之前的字符个数 printf(%zd\n,strlen(arr 0)); //arr0还是首元素地址同上 //printf(%zd\n,strlen(*arr)); arr是首元素地址解引用后得到首元素ASCLL码为97可能会作为地址非法访问内存导致程序崩溃 //printf(%zd\n,strlen(arr[1])); 是第二个元素道理同上 printf(%zd\n,strlen(arr)); //arr是数组的地址但也是从首元素地址开始往后找\0统计\0之前的字符个数 printf(%zd\n,strlen(arr 1)); //跳过一个数组后的地址往后找\0随机值 printf(%zd\n,strlen(arr[0] 1)); //第二个元素的地址为5个字符6 6 6 26 5const char * p abcdef; printf(%zd\n,sizoef(p)); //p是指针变量为4/8 printf(%zd\n,sizoef(p1)); //p1是b的地址为4/8 printf(%zd\n,sizoef(*p)); //*p a printf(%zd\n,sizeof(p[0])); //a printf(%zd\n,sizoef(p)); //是指针变量p的地址为4/8 printf(%zd\n,sizoef(p1)); //跳过一个字符串长度后的地址为4/8 printf(%zd\n,sizeof(p[0]1)); //是b的地址为4/88 8 1 1 8 8 8char * p abcedf; printf(%zd\n,strlen(p)); //6 p是a的地址 printf(%zd\n,strlen(p 1)); //5 是b的地址 //printf(%zd\n,strlen(*p)); //非法访问 //printf(%zd\n,strlen(p[0])); //非法访问 printf(%zd\n,strlen(p)); //指针变量的地址开始往后找\0,随机值 printf(%zd\n,strlen(p 1)); //随机值 printf(%zd\n,strlen(p[0] 1)); //56 5 6 30 5int a[3][4] {0}; printf(%zd\n,sizoef(a)); //48 printf(%zd\n,sizeof(a[0][0])); //4 a[0][0]是第一行第一个元素 printf(%zd\n,strlen(a[0])); //16 a[0]是第一行一维数组的数组名单独放在sizoef内计算的是第一行这个一位数组的大小 printf(%zd\n,sizeof(a[0]1)); //4/8 是第一行第二个元素的地址 printf(%zd\n,sizoef(*(a[0]1))); //4 第一行第二个元素 printf(%zd\n,sizoef(a1)); //4/8 第二行的一维数组的地址 printf(%zd\n,sizeof(*(a1))); //16 访问第二行的一维数组 printf(%zd\n,sizoef(a[0]1)); //4/8 第二行一维数组的地址 printf(%zd\n,sizoef(*(a[0]1))); //4 第二行的第一个元素 printf(%zd\n,sizeof(*a)); //16 访问第一行的一维数组 printf(%zd\n,sizoef(a[3])); //16 没有越界访问sizeof内部表达式不计算48 4 16 8 4 8 16 8 16 16 16二、指针运算1.int a[5] {1,2,3,4,5}; int * ptr (int*)(a1); //向前跳过一个数组长度后的地址 printf(%d,%d\n,*(a1),*(ptr-1)); return 0;2,52.struct test { int num; char * pcname; short sdata; char ch[2]; short sba[4]; }*p (sturct test *)0x100000; int main() { printf(%p\n,p 0x1); printf(%p\n,(unsigned long)p 0x1); //对于整数加1就是加1 printf(%p\n,(unsigned int *)p 0x1); //无符号整型指针加1跳过一个类型后的指针 return 0; }00100014 00100001 001000043.int a[3][2] {(0,1),(2,3),(4,5)}; int * p; p a[0]; printf(%d,p[0]); //注意这里是而不是 {}逗号表达式的值是最后一个表达式的值即{135} return 0;04.int a[5][5]; int(*p)[4]; p a; printf(%d,%d\n,p[4][2] - a[4][2],p[4][2] - a[4][2]); //注意根据指针类型来决定访问空间大小的跨度指针-指针的前提是两个指针指向同一块空间指针-指针得到的结果的绝对值是两个指针之间的元素个数小地址 - 大地址 会得到负数fffffffc -45.int aa[2][5] {1,2,3,4,5,6,7,8,9,10}; int * p1 (int *)(aa 1); int * p2 (int *)(*(aa 1)); printf(%d,d,*(ptr - 1),*(ptr2 - 1));10,56.char * a[] {work,at,alibaba}; char ** pa a; pa ; printf(%s\n,*pa);at7.char * c[] {ENTER,NEW,POINT,FIRST}; char ** cp[] {c 3, c 2, c 1,c}; char *** cpp cp; printf(%s\n,**cpp); printf(%s\n,*--*cpp 3); printf(%s\n,*cpp[-2] 3); printf(%s\n,cpp[-1][-1] 1);POINT ER ST EW