当前位置:首页 > 前端设计 > 正文

指针数组和指向指针的指针?指针数组怎么赋值

指针数组和指向指针的指针?指针数组怎么赋值

大家好,关于指针数组和指向指针的指针很多朋友都还不太明白,今天小编就来为大家分享关于指针数组怎么赋值的知识,希望对各位有所帮助!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;唯一的区别是,定义数组同时会分配内存,指针使用前要赋值

关于指针数组和指向指针的指针到此分享完毕,希望能帮助到您。

最新文章