博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++数组指针和指针数组详解
阅读量:4056 次
发布时间:2019-05-25

本文共 1573 字,大约阅读时间需要 5 分钟。

指针数组:

指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型,在32位系统中,指针占四个字节。

数组指针:

数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。

指针数组

首先先定义一个指针数组,既然是数组,名字就叫arr

char *arr[4] = {
"hello", "world", "shannxi", "xian"};

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

数组指针

首先来定义一个数组指针,既然是指针,名字就叫pa,要给指针加括号。

char (*pa)[4];

pa是一个指针指向一个char [4]的数组,每个数组元素是一个char类型的变量。既然pa是一个指针,存放一个数组的地址,那么在我们定义一个数组时,数组名称就是这个数组的首地址,那么这二者有什么区别和联系呢

char a[4];

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

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关键字求数组所占的内存是整个数组大小,指针不是。
 ②对数组名取地址时是取得一个代表整个数组的地址,对指针取地址则不然。

指针数组在参数传递时的使用

指针数组常用在主函数传参,在写主函数时,参数有两个,一个确定参数个数,一个这是指针数组用来接收每个参数(字符串)的地址

int main(int argc, char *argv[])
不能传递整个数组过去,如果数组很大,这样内存利用率很低,所以应该传递数组的首地址,用一个指针接收这个地址。因此,指针数组对应着二级指针
void fun(char **pp); //子函数中的形参
fun(char *p[]); //主函数中的实参

数组指针传参时的使用

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

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

在这里插入图片描述

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

转载地址:http://queci.baihongyu.com/

你可能感兴趣的文章
当前主要目标和工作
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
一文看清HBase的使用场景
查看>>
解析zookeeper的工作流程
查看>>
搞定Java面试中的数据结构问题
查看>>
慢慢欣赏linux make uImage流程
查看>>
linux内核学习(7)脱胎换骨解压缩的内核
查看>>
以太网基础知识
查看>>
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>