数组名是什么类型指针?

Primer_CC 2014-05-29 04:33:47

《C++Primer》第四版
4.2.4 使用指针访问数组元素
C++语言中,指针和数组密切相关。特别是在表达式中使用数组名时,该名字会自动转换为指向数组第一个元素的指针。
int ia[]={0,2,4,6,8};
int ip=ia;

问题:
1.

#include <iostream>
int main()
{
int ia[]={0,2,4,6,8};
int ip=ia;
ia=ia+1; //这行错。
}

ubuntu系统,用g++编译出错:
a.cc: 在函数‘int main()’中:
a.cc:6:11: 错误: 将‘int *’赋值给‘int [5]’时类型不兼容



2.数组名用在表达式时,它是什么类型的指针?
A.int *
B.int *const
C.int const*
C.int * const*


...全文
972 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
cao_julians 2014-05-30
  • 打赏
  • 举报
回复
发现太多的人涉及到指针,只有一个概念--指针变量,必须是一存储了sth的实体。 设p是指向数组元素的指针,p=p+1是常见的赋值表达式,问p+1是什么?用*(p+1)访问元素时(p+1)叫什么?能把(p+1)叫指针变量吗?
ojc520520 2014-05-30
  • 打赏
  • 举报
回复
天才2012 2014-05-30
  • 打赏
  • 举报
回复
看看&a+1会好理解些
cao_julians 2014-05-30
  • 打赏
  • 举报
回复
数组名是首元素的指针,并不是说数组名是存储首元素地址的指针变量,它不是变量,即它不能被赋值(它不是左值-----更严格的说法就不提了) 不知源头在哪儿,一提指针,就说是”指针变量“的简称。这真令人无语。 指针究竟是什么?我个人认为,指针是同时拥有指向对象的地址和类型的量,它可以是常量、表达式、变量等多种形式,只有指针的值被存储了----存储它的才是指针变量;而指针在代码中表现形式远远不是”指针变量“所能涵盖的
孤独de守候 2014-05-30
  • 打赏
  • 举报
回复
常量指针不能修改
lin5161678 2014-05-30
  • 打赏
  • 举报
回复
引用 36 楼 Primer_CC 的回复:
冷静点 忘掉所谓的 数组是指针这个错误的想法 否则 你只能看到 书的内容和你的想法不停的发送冲突
cjzzmdn 2014-05-30
  • 打赏
  • 举报
回复
对数组[]名取地址还是数组名指向的。。当时学的都忘了
lin5161678 2014-05-30
  • 打赏
  • 举报
回复
引用 33 楼 twtiqfn 的回复:
这么多回复的了
回复多有什么用 楼主都看不懂 叹息 被渣书扭曲世界观 不好改了
twtiqfn 2014-05-30
  • 打赏
  • 举报
回复
这么多回复的了
anshiny 2014-05-30
  • 打赏
  • 举报
回复
数组名也可 以理解为指针。 如int array[100] array可理解为指针,但它是int * const p这种类型的指针。
bfdeh 2014-05-30
  • 打赏
  • 举报
回复
我只看了标题,我只说一句,数组名不是指针。
unituniverse2 2014-05-29
  • 打赏
  • 举报
回复
引用 24 楼 sdghchj 的回复:
[quote=引用 23 楼 Primer_CC 的回复:] 各位: 数组名,在表达式。它什么指针:int *,int *const,还是int const *呢?
我都说了,数组名相当于int *const指针,注意,是相当于,但并不是指针,只是数组名的值相当于而已。 int const *p跟 const int *p是等价的,是指p指向的变量的值不能被更改,但p本身可以自增自减。 而 int * const p则表示p本身指向的地址不能再改变,但是它指向的变量的值可以改变。 如何理解这种const指针到底是哪个可变哪个不可改,这样写你或许能更明白:int * const p和int const *p、 const int *p. 注意不要看const int* p,会误解的。 而数组名ia,其本身不能自增自减,但是可以用:*(ia+0)=1或者a[0]=1,改变它指向的变量的值。 数组名作为函数参数传递时,会自动退化为指向其首元素地址的指针。[/quote] 数组名才不会自动退化成指针。所谓的退化是因为你使用的函数就是用指针做参数,而数组名允许隐式转换成指针,这样让转换变得别无选择(只能先转换了再传递),别忘了C++里面函数参数是可以直接用数组的引用来传递的,这样就不会发生隐式转成指针的转换了: int (& q)[5] = ia;
unituniverse2 2014-05-29
  • 打赏
  • 举报
回复
引用 10 楼 soulya928 的回复:
[quote=引用 8 楼 lin5161678 的回复:] [quote=引用 7 楼 soulya928 的回复:] sizeof 是求你后面类型所占的字节数,ia是一个int的数组类型 而p只是一个int指针永远都等于4。 如果非要拿他两放在一起比较,也只能勉强说,ia是一个常量首地址, 所以可以看成是const int*。但他们两是肯定不一样的。
实际情况是 ia 在某些情况下会隐式转化为指向数组首元素的指针 ia 的数据类型就是 int[5] 而不是什么 指针 常指针[/quote] 隐式转化为指向数组首元素的指针 --> 这句话的意思是,不就是说ia可以看成是数组的首地址吗? 既然ia是保存一个地址,而且不可变的地址,为什么就不能看成是常量指针呢?[/quote] 隐式转换 怎么能 “看作是”?? 整型能隐式转换成浮点类型,那么整型也可以看做是浮点类型了?不对吧?? 至于为什么说不能看成常量指针: struct A { int a[1]; }; 然后取sizeof(A),将等于sizeof(int)而不等于sizeof(int)+sizeof(int *),也就是根本不存在所谓的指针。
sdghchj 2014-05-29
  • 打赏
  • 举报
回复
引用 23 楼 Primer_CC 的回复:
各位: 数组名,在表达式。它什么指针:int *,int *const,还是int const *呢?
我都说了,数组名相当于int *const指针,注意,是相当于,但并不是指针,只是数组名的值相当于而已。 int const *p跟 const int *p是等价的,是指p指向的变量的值不能被更改,但p本身可以自增自减。 而 int * const p则表示p本身指向的地址不能再改变,但是它指向的变量的值可以改变。 如何理解这种const指针到底是哪个可变哪个不可改,这样写你或许能更明白:int * const p和int const *p、 const int *p. 注意不要看const int* p,会误解的。 而数组名ia,其本身不能自增自减,但是可以用:*(ia+0)=1或者a[0]=1,改变它指向的变量的值。 数组名作为函数参数传递时,会自动退化为指向其首元素地址的指针。
Primer_CC 2014-05-29
  • 打赏
  • 举报
回复
各位: 数组名,在表达式。它什么指针:int *,int *const,还是int const *呢?
Primer_CC 2014-05-29
  • 打赏
  • 举报
回复
2楼:

int* pp = &ia + 1;
这个,能编译通过么?
Primer_CC 2014-05-29
  • 打赏
  • 举报
回复
2楼: [code=c] int* pp = &ia 1
lin5161678 2014-05-29
  • 打赏
  • 举报
回复
引用 19 楼 Primer_CC 的回复:
a.cc:6:11: 错误: 将‘int *’赋值给‘int [5]’时类型不兼容。 为什么,编译信息,不是“int *const ”,而是“int *”?
因为根本没有const
Primer_CC 2014-05-29
  • 打赏
  • 举报
回复
a.cc:6:11: 错误: 将‘int *’赋值给‘int [5]’时类型不兼容。 为什么,编译信息,不是“int *const ”,而是“int *”?
li4c 2014-05-29
  • 打赏
  • 举报
回复
数组元素是什么类型,数组名的就是什么类型的“指针”
加载更多回复(17)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧