阿里云腾讯云网站建设,为什么需要响应式网站,济南建设局,公司名称起名大全免费代码分析 9. 指针和数组代码解析一维数组字符数组字符串二维数组 10. 指针代码分析eg1eg2eg3eg4eg5eg6eg7eg8 10.1 指针进阶_数组指针 10.2 指针进阶_函数指针
9. 指针和数组代码解析
数组名arr是首元素地址
例外#xff1a;
1. sizeof(arr)#xff0c;计算整个数组的大小
1. sizeof(arr)计算整个数组的大小sizeof内部单独放一个数组名数组名表示整个数组。
2. arr取出的是 数组的地址。数组名数组名表示 整个数组。
除此1,2两种情况之外所有的数组名都表示数组首元素的地址一维数组
int a[] { 1,2,3,4 };
printf(%d\n, sizeof(a));//数组大小--4*416 byte
printf(%d\n, sizeof(a0));//a首元素地址a0--4/8 byte
printf(%d\n, sizeof(*a));//a首元素地址解引用*a首元素大小--4 byte
printf(%d\n, sizeof(a1));//a1--4/8 byte
printf(%d\n, sizeof(a[1]));//第二个元素大小--4 byte
printf(%d\n, sizeof(a));//数组地址a--4/8 byte
printf(%d\n, sizeof(*a));
//*a -- a -- 数组地址a解引用*a数组大小大小--16 byte
//a -- int(*)[4] --类型
// -- *a -- a[4] 16 byte
printf(%d\n, sizeof(a1));//相对于a跳过了整个数组地址大小--4/8 byte
printf(%d\n, sizeof(a[0]));//首元素地址--4/8 byte
printf(%d\n, sizeof(a[0]1));//第二个元素地址--4/8 byte字符数组
char arr[] {a,b,c,d,e,f};
printf(%d\n, sizeof(arr));//整个数组大小 -- 6 byte
printf(%d\n, sizeof(arr0));//首元素地址 -- 4/8 byte
printf(%d\n, sizeof(*arr));//首元素大小 -- 1 byte
printf(%d\n, sizeof(arr[1]));//第二个元素大小 -- 1 byte
printf(%d\n, sizeof(arr));//数组地址 -- 4/8byte
printf(%d\n, sizeof(arr1));//相对于arr跳过了整个数组地址--4/8 byte
printf(%d\n, sizeof(arr[0]1));//首元素地址1第二个元素地址--4/8 byteprintf(%d\n, strlen(arr));//strlen读到\0才结束统计\0前字符串个数随机值
printf(%d\n, strlen(arr0));//首元素地址arr0随机值
printf(%d\n, strlen(*arr));//errstrlen参数部分需要传地址
//*arr是首元素aa的ASCII码位97strlen从97开始统计字符串长度非法访问内存
printf(%d\n, strlen(arr[1]));//err
printf(%d\n, strlen(arr));//arr -- char(*)[6]数组地址随机值
printf(%d\n, strlen(arr1));//随机值
printf(%d\n, strlen(arr[0]1));//第二个元素地址随机值char arr[] abcdef;//[a b c d e f \0]
printf(%d\n, sizeof(arr));//数组大小 -- 7
printf(%d\n, sizeof(arr0));//首元素地址 -- 4/8
printf(%d\n, sizeof(*arr));//首元素 -- 1
//*arr -- *(arr 0) -- arr[0]
printf(%d\n, sizeof(arr[1]));//第二元素 -- 1
printf(%d\n, sizeof(arr));//数组地址 -- 4/8
printf(%d\n, sizeof(arr1));//数组地址1 -- 4/8
printf(%d\n, sizeof(arr[0]1));//第二元素地址 -- 4/8printf(%d\n, strlen(arr));//数组地址 6
printf(%d\n, strlen(arr0));//首元素地址 6
printf(%d\n, strlen(*arr));//err 首元素a
printf(%d\n, strlen(arr[1]));//err 首元素a
printf(%d\n, strlen(arr));//数组地址 6
printf(%d\n, strlen(arr1));//数组地址1 random
printf(%d\n, strlen(arr[0]1));//第二元素地址 5字符串
char* p abcdef;//[a b c d e f \0]p存放a的地址
printf(%d\n, sizeof(p));//指针p 4/8
printf(%d\n, sizeof(p1));//b的地址 4/8
printf(%d\n, sizeof(*p));//a 1
printf(%d\n, sizeof(p[0]));//a 1
//*p -- *(p 0) -- p[0]
printf(%d\n, sizeof(p));//p的地址 4/8
//p -- char**
printf(%d\n, sizeof(p1));//p的地址1 4/8
printf(%d\n, sizeof(p[0]1));//b的地址1 4/8printf(%d\n, strlen(p));//a的地址 6
printf(%d\n, strlen(p1));//b的地址 5
printf(%d\n, strlen(*p));//erra
printf(%d\n, strlen(p[0]));//erra
printf(%d\n, strlen(p));//p的地址 random
printf(%d\n, strlen(p1));//p的地址1 random
printf(%d\n, strlen(p[0]1));//b的地址 5二维数组
int a[3][4] {0};
printf(%d\n,sizeof(a));//数组a大小 3*4*448
printf(%d\n,sizeof(a[0][0]));//[0][0]元素 4
printf(%d\n,sizeof(a[0]));//[0]行数组大小 4*416
//每行都是二维数组的一个元素一维数组的数组
//a[0]是第一行一维数组的 数组名
printf(%d\n,sizeof(a[0]1));//第1行数组第二个元素地址 4/8
printf(%d\n,sizeof(*(a[0]1)));//第2行数组首元素大小 4
printf(%d\n,sizeof(a1));//a是首元素地址是第一行的地址a1是第2行地址 4/8
printf(%d\n,sizeof(*(a1)));//第2行数组大小 4*416
printf(%d\n,sizeof(a[0]1));//a是第1行的地址a1是第2行地址 4/8
printf(%d\n,sizeof(*(a[0]1)));//第2行数组大小 4*416
printf(%d\n,sizeof(*a));//第1行数组大小 4*416
//a 首元素地址第1行地址
//*a 第1行
//*a -- *(a0) -- a[0]
printf(%d\n,sizeof(a[3]));//第4行数组大小 4*416
//a[3] -- int [4]
//sizeof()只关注类型不会计算10. 指针代码分析
eg1
int main()
{ int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(a 1);//a 取出 数组地址a1 向后跳一个数组长度 的地址printf( %d,%d, *(a 1), *(ptr - 1));//(a1) 首元素地址1第二元素地址。*(a1) -- 2//ptr 是a[5]向后跳一个数组长度 的地址//(ptr - 1) 向前访问4byte -- 5return 0;
}eg2
//结构体的大小是20个字节
struct Test
{ int Num;//4char *pcName;//1short sDate;//2char cha[2];//1short sBa[4];//2
}*p (struct Test*)0x100000;
//结构体Test类型的变量大小是20个字节
int main()
{ printf(%p\n, p 0x1);//跳过一个结构体 20byte//0x100000 0x000014 0x100014printf(%p\n, (unsigned long)p 0x1);//整形1byte -- 0x100001printf(%p\n, (unsigned int*)p 0x1);//跳过4byte -- 0x100004return 0;
}eg3
int main()
{ int a[4] { 1, 2, 3, 4 };//小端 [01 00 00 00| 02 00 00 00 00| 03 00 00 00| 04 00 00 00]int *ptr1 (int *)(a 1);//a 取出数组地址a1 向后跳一个数组长度 的地址int *ptr2 (int *)((int)a 1);//(int)a a地址的值 1byte printf( %x,%x, ptr1[-1], *ptr2);//%x -- 16进制打印//ptr1[-1] -- 4//*ptr2 -- 01 |00 00 00 02| --2000000return 0;
}eg4
#include stdio.h
int main()
{ int a[3][2] { (0, 1), (2, 3), (4, 5) };//(0,1) -- 1. {0,1} is right//{{1,3}, {5,0}, {0,0}};int *p;p a[0];//a是首元素地址即第一行地址a[0][0]的地址printf( %d, p[0]);//p[0] -- *(p0) --*p -- 1return 0;
}eg5
int main()
{ int a[5][5]; int(*p)[4]; p a; printf( %p,%d\n, p[4][2] - a[4][2], // -4p[4][2] - a[4][2]); return 0;
}-4 --
10000000 00000000 00000000 00000100
11111111 11111111 11111111 11111011
1111 1111 1111 1111 1111 1111 1111 1100
F F F F F F F C
0xFFFFFFFCeg6
int main()
{ int a[2][5] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int *ptr1 (int *)(a 1);//数组地址1跳过一个数组的大小int *ptr2 (int *)(*(a 1));//第一行地址1第二行地址,*解引用 -- a[1][0]//a 1 类型为 int (*)[5] 指向二维数组 a 的第二行//*(a 1) 表示指向二维数组 a 第二行首元素的指针它指向的是 a[1][0]//*(a 1) -- a[1]数组名 -- 首元素地址a[1][0]printf( %d,%d, *(ptr1 - 1), *(ptr2 - 1));//ptr1 -1 -- 10//ptr2 -1 -- 5return 0;
}eg7
#include stdio.h
int main()
{ char* a[] {work,at,sangfor};//char* p sangfor;//存放字符串首字符地址char** pa a;//pa存放数组名pa;// wo -- aprintf(%s\n, *pa);return 0;
}eg8
int main()
{ char* c[] {ENTER,NEW,POINT,FIRST};//指针数组存放首字符地址char** cp[] {c3, c2, c1, c};char*** cpp cp;printf(%s\n, **cpp);//POINTprintf(%s\n, *--*cpp3);printf(%s\n, *cpp[-2]3);printf(%s\n, cpp[-1][-1]1);return 0;
}printf(%s\n, ** cpp);//POINT 注意cpp值已经更改printf(%s\n, *--*cpp3);//ERprintf(%s\n, *cpp[-2]3);//STprintf(%s\n, cpp[-1][-1]1);//EW10.1 指针进阶_数组指针 10.2 指针进阶_函数指针