C 数组指针详解 | 您所在的位置:网站首页 › c语言数组减法 › C 数组指针详解 |
#include void main(void) { /*测试数据*/ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr1 = NULL; int *ptr2 = NULL; /*实验一:将两种数组指针的表达式,赋值到两个指针后在进行操作*/ ptr1 = &a; ptr2 = a; printf("example one : ptr1: %p.\n", ptr1); printf("example one : ptr2: %p.\n", ptr2); printf("example one : ptr1 - ptr2: %d.\n\n", ptr1 - ptr2); ptr1 = ptr1 + 1; ptr2 = ptr2 + 1; printf("example one : ptr1: %p.\n", ptr1); printf("example one : ptr2: %p.\n", ptr2); printf("example one : ptr1 - ptr2: %d.\n\n", ptr1 - ptr2); /********************************************/ /*实验二:将两种数组指针的表达式,直接进行操作*/ ptr1 = &a + 1; ptr2 = &a; /* 下方代码,打印出两个指针的地址,应该相差20字节. 最后打印出来的指针差,应该是数字5. 因为测试数据是一个int型数组,地址差 5 * sizeof(int) = 20. 最后的打印数据5是两个指针之间差距了几个数组元素长度. */ printf("example two : ptr1: %p.\n", ptr1); printf("example two : ptr2: %p.\n", ptr2); printf("example two : ptr1 - ptr2: %d.\n\n", ptr1 - ptr2); /********************************************/ /*实验三:为了上述实验的,将测试数据改为char型*/ char b[5] = { 1, 2, 3, 4, 5 }; char *c_ptr1 = NULL; char *c_ptr2 = NULL; c_ptr1 = &b + 1; c_ptr2 = &b; /* 下方代码,打印出两个指针的地址,应该相差5字节. 最后打印出来的指针差,应该是数字5. 因为测试数据是一个int型数组,地址差 5 * sizeof(char) = 5. 最后的打印数据5是两个指针之间差距了几个数组元素长度. */ printf("example three : c_ptr1: %p.\n", c_ptr1); printf("example three : c_ptr2: %p.\n", c_ptr2); printf("example three : c_ptr1 - c_ptr2: %d.\n\n", c_ptr1 - c_ptr2); /********************************************/ /**************************** 结论: C语言中,使用数组指针,涉及到的因素有亮点 1 - 操作的是数组的指针(&a)(&b) 还是 数组第一个元素的 指针(a)(b) 2 - 数组数据内存地址的间隔,和地址的距离是两个概念,间隔是数组元素序号的差,剧里是间隔乘以数组元素的size. 使用建议: C语言数组的使用,一般情况,建议使用赋值到指针后,进行操作,并且避免指针之间直接进行减法操作. ****************************/ /*实验四:为了更容易理解上述内容,做如下实验*/ struct TempStruct { int c[5]; }; struct TempStruct TempStructEntry; struct TempStruct *TempStructPoint = NULL; int *s_ptr = NULL; TempStructPoint = &TempStructEntry; s_ptr = TempStructEntry.c; printf("example four : Struct: %p.\n", &TempStructEntry); printf("example four : TempStructPoint: %p.\n", TempStructPoint); printf("example four : s_ptr: %p.\n\n", s_ptr); printf("example four : Struct: %p.\n", (&TempStructEntry) + 1); printf("example four : TempStructPoint: %p.\n", TempStructPoint + 1); printf("example four : s_ptr: %p.\n\n", s_ptr + 1); /* 在上面的试验中,我们可以看到结构体和结构体内数组元素的第一个数据在,地址是相同的. 但是在不同类型的指针加一后,说打印的地址,明显不一致. 和之前描述的数组的指针和数组第一个元素的指针,有相似之处. 结构体指针加一后,和起始地址,差距了20个字节,正好是结构体内,整个数组的长度. */ system("pause"); } 运行结果: ![]() PS:最后吐槽下,豆瓣的编辑界面太难用了........... |
CopyRight 2018-2019 实验室设备网 版权所有 |