指针数组和指向指针的指针?指针数组怎么赋值
- 前端设计
- 2023-09-28
- 51
大家好,关于指针数组和指向指针的指针很多朋友都还不太明白,今天小编就来为大家分享关于指针数组怎么赋值的知识,希望对各位有所帮助!C语言学到指针了,我经常把数组指针和指针...
大家好,关于指针数组和指向指针的指针很多朋友都还不太明白,今天小编就来为大家分享关于指针数组怎么赋值的知识,希望对各位有所帮助!
C语言学到指针了,我经常把数组指针和指针数组弄混,它俩究竟有何区别该如何理解
谢谢邀请。
很多C语言初学者在学到指针时,都会遇到“数组指针”和“指针数组”这两个名词,然后就一脸懵逼了,其实在考虑C语言中的数组指针和指针数组时,只需多加几个字,一切就清晰许多了:
数组指针->数组类型的指针,所以数组指针是一个指针。
指针数组->指针类型的数组,所以指针数组其实是一个数组。
指向数组的指针在讨论数组指针之前,先来看一段C语言代码,如下:
C语言中的指针不仅有加法运算,还有减法运算,不过乘除运算就是非法的了。编译并执行上述C语言代码,可以得到如下输出:
其实,访问指针p指向的数值,除了“*”运算符外,也可以以数组的形式,本例中p[N]和*(p+N)是等价的:
相信有读者已经注意到p[-1]了,这似乎与C语言数组下标不能为负的语法相悖,那为何这里能够编译通过,并正常运行呢?鉴于该问题与主题无关,这里不再赘述,感兴趣的读者可翻阅我之前的文章。数组指针如果题主觉得上面的C语言代码示例没有难度,其实你已经会用数组指针了。在上面的例子中,p就是一个数组指针。p是一个char*型的指针,它指向数组,所以叫“数组指针”。
数组指针就是指向数组的指针,就像int型指针就是执行int型变量的指针一样。
数组指针就这么简单。其实,记住数组指针就是指向数组的指针这句话后,再复杂点的情况也能轻松应对。请看下面的例子,我们先用C语言定义一个二维数组,用来存三个人名:
name[3][6]中的3表示name数组一共有3行,6表示每行最多有6个char型数据。现在,我想用数组指针指向这三个人名,可以如下定义:
()优先级高,说明p2首先是个指针,什么类型呢?括号里的内容看过了,现在忽略它,那显然,p2是一个指向char[6](6元素数组类型)的指针,name就是一个char[6]型的数据,所以可以直接把name赋值给p2:
p2=name;如果题主看过我之前的文章,应该知道指针的加法运算结果受指针的类型影响,那如果p2指向的地址为0,p2[1](即p2+1)指向的地址为多少呢?
答案是6,因为p2是一个char[6]类型的指针。对于name而言,一行为6字节,因此p2[N]恰好指向的是name的每一行,因此数组指针又被称作“行指针”。如果执行以下C
语言代码:
实际上就是把name记录的三个人名打印出来。以数组的形式访问也是一样的:
编译并执行,得到如下输出:
指针数组讨论完了数组指针,再来看看指针数组。其实,指针数组就是一个数组,只不过这个数组里存放的都是指针而已。就跟我们说int数组是一个存放int的数组一样。在C语言中指针数组的定义也很简单:
char*p3[3];[]的优先级高于*,说明p3首先是个数组,什么类型的数组呢?char*型的,char*表示一个指针类型,所以p3就是一个指针数组。
如果使用指针数组指向name,就不能直接把name赋值给p3了,因为类型不同。但是,p3里存放的都是char*型的指针,即p3[0],p3[1],p3[2]是char*型的指针,而name[0],name[1],name[2]也是char*型的指针,所以可以把name[N]赋值给p3[N],请看如下C语言代码:
编译并执行,可以得到如下输出:
与预期一致。这样,我们就使用了C语言中的指针数组访问了name数组。
小结到这里,C语言中的数组指针和指针数组两者的区别就豁然开朗了,数组指针是一个指针变量,它占有内存中一个指针的存储空间。指针数组是多个指针变量,也即数组,以数组形式存在内存当中,占有多个指针的存储空间。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
c++如何定义指向结构体数组的指针
structperson{char*name?
intage
}*person1={"Jerry",6};
数组指针的语法形式
数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int(*p)[10];p即为指向数组的指针,又称数组指针。
指针数组
可以debug看一下:
str这个命名变量,指向的内存地址就是这个指针数据的首地址;
str[0]的值就是数组中第一个字符串的首地址;
str[1]的值就是数组中第二个字符串的首地址;
你可以debug看这些命名变量的地址呀?
不看内存地址,你如何理解指针?
指针的本质就是对某个地址的解释!
char*a;编译器对a指向的地址,就解释为一个字符。
假设a指向内存地址0x0001,而0x0001地址存的是0x610x620x63,那编译器怎么解释*a?
编译器会看a的类型是char,即看这个地址的1个字节就好了,所以编译器解释*a=’a'
指针类型就是告诉编译器怎么解释指针变量值指向的地址。
数组指针和指针数组的区别
区别是数据类型不同。
数组指针:是指一个指向数组的指针,它其实还是一个指针,只不过是指向数组而已;
指针数组:是指一个数组里面装着指针,也即指针数组是一个数组;
C/C++关于指向指针的指针为什么可以用数组表示
因为数组名就是指针常量,所有语法都是一样的inta[10];int*p=a;a[0]=12;p[1]=34;*(a+2)=56;*(p+3)=78;唯一的区别是,定义数组同时会分配内存,指针使用前要赋值
关于指针数组和指向指针的指针到此分享完毕,希望能帮助到您。
本文链接:http://www.xinin56.com/qianduan/40969.html