0
点赞
收藏
分享

微信扫一扫

数组指针的解引用和跨度问题

Brose 2022-05-04 阅读 53

1.声明:

进行声明时一定要注意变量先与谁结合,如上例中:若先与指针标识符*先结合则说明主体为指针 ,若先与[]结合则说明主体时数组

2.解引用问题:

#include<stdio.h>

int main(void)
{
	int temp[5] = {1, 2, 3, 4, 5};
	int (*p)[5] = &temp;//此处的数组指针p代表整个一维数组的地址

	printf("addr of &p  : %p\n", &p);   //数组指针的地址
	printf("addr of p   : %p\n", p);    //一维数组temp的地址 
	printf("addr of *p  : %p\n", *p);	//一维数组temp首元素的地址 
	printf("addr of **p : %d\n", **p);  //一维数组temp首元素的数值

    return 0;
}

3.跨度问题:

#include<stdio.h>

int main(void)
{
	int temp[5] = {1, 2, 3, 4, 5};
	
	int (*p)[5] = &temp;
	
	for(int i = 0; i < 2; i++)
	{
		printf("%p\n", *(p + i));  //运行可知跨度为20个字节 
	}
	for(int i = 0; i < 2; i++)
	{
		printf("%p\n", *p + i);    //运行可知跨度为4个字节
	}
	
	return 0;
}

(*p+i):

此处的p代表整个一维数组的地址,对其解引用(*p)即为一维数组首元素的地址,而此处定义的首元素类型为int型,故跨度为4个字节。

(p+i):

此处的p代表整个一维数组的地址,故其跨度为整个一维数组,此处定义的一维数组有5个int型数据,故跨度为20个字节。 

解决跨度问题重点在于是否能够正确理解变量名的意义,例如上面声明的数组指针变量p则代表整个一维数组的地址,而对于一维数组,其数组名则代表其首元素(即一个单一的数据,如int,double,char型数据等等)的地址,(*p+i)的跨度会根据首元素的类型发生变化,而对于二维数组,其数组名同样是代表其首元素的地址,但其首元素并非单一的一个数据,而是一个一维数组。

举报

相关推荐

0 条评论