【C++】二、指针数组与数组指针


1.指针数组

1.1简介

指针的数组,是一个数组,里面的每一个元素都是指针,在32位系统中,指针占四个字节。

	//arr[4]是一个定义的数组。把它对应到对应到内存中,arr是一个在栈区,有四个元素的数组
	//而每一个元素又是一个指针,所以说它的四个元素各占四个字节,所以变量arr的大小是16个字节。
	//arr+1会跳过四个字节。也就是一个指针的大小 。
	char *arr[4] = {"hello", "world", "shannxi", "xian"};

1.2应用

1)指针数组常用在主函数传参,在写主函数时,参数有两个,一个确定参数个数,一个这是指针数组用来接收每个参数(字符串)的地址
int main(int argc, char *argv[])

2)不能传递整个数组过去,如果数组很大,这样内存利用率很低,所以应该传递数组的首地址,用一个指针接收这个地址。因此,指针数组对应着二级指针

void fun(char **pp); //子函数中的形参
fun(char *p[]); //主函数中的实参

2.数组指针

2.1简介

数组的指针,是一个指针,存放着一个数组的首地址

	//pa是一个指针指向一个char [4]的数组,每个数组元素是一个char类型的变量。
	char (*pa)[4];

2.2应用

数组指针既然是一个指针,那么就是用来接收地址,在传参时就接收数组的地址,所以数组指针对应的是二维数组。

void fun(int (*P)[4]);   		//子函数中的形参,指针数组 
a[3][4] = {0};              	//主函数中定义的二维数组
fun(a);                       	//主函数调用子函数的实参,是二维数组的首元素首地址

3.数组名称和数组指针的区别

a是一个长度为4的字符数组,a是这个数组的首元素首地址。既然a是地址,pa是指向数组的指针,那么能将a赋值给pa吗?答案是不行的!因为a是数组首元素首地址,pa存放的却是数组首地址,a是char 类型,a+1,a的值会实实在在的加1,而pa是char[4]类型的,pa+1,pa则会加4,虽然数组的首地址和首元素首地址的值相同,但是两者操作不同,所以类型不匹配不能直接赋值,但是可以这样:pa = &a,pa相当与二维数组的行指针,现在它指向a[4]的地址。

char *p=a;   //p是指向数组首元素的指针

数组名和指针虽都代表数组首元素的地址,但意义不同。把它们分别比作省政府和市政府,数组名相当于省政府,指向首元素的指针代表市政府。如陕西的省政府在西安,而西安市的市政府也在西安,两个政府都在西安,但其代表的意义完全不同。

  • 用sizeof关键字求数组所占的内存是整个数组大小,指针不是。
  • 对数组名取地址时是取得一个代表整个数组的地址,对指针取地址则不然。

4.多维数组的标识

char buf[]与char *buf本质是一样的

sizeof(a)=12*4=48
sizeof§=4 //(x64系统为8)
当sizeof用于变量时返回这个变量占用的实际空间的大小。当sizeof用于数组名时,返回整个数组的大小(这里的大小指占用的字节数)。p是一个指针变量,这个变量占用四个字节。

5.参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值