C 数组指针详解 您所在的位置:网站首页 c语言数组减法 C 数组指针详解

C 数组指针详解

2022-05-20 14:01| 来源: 网络整理| 查看: 265

#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 实验室设备网 版权所有