有关C++指针和数组的一个小问题

int a[]={2,4,7,8,9};
int n=sizeof(a)/sizeof(int);\\n是数组a中的个数

a也就能表示数组a[0]的首地址嘛,为什么sizeof(a)能表示整个数组的长度?

数组是一种类型,独立的类型,不是什么指针或者地址。
所谓数组名能作为数组首地址,是因为c++进行了隐式的类型转换。就好像
char c = 'a';
int i = c;
一样,其实是int i = static_cast<int>(c);,只不过char类型被隐式转换成int不需要写出来。所以数组作为地址时c++其实做的是int *p=static_cast<int *>(a);,这是一种内置的隐式类型转换而已,把数组转换成元素指针,值为数组首地址。

在使用模板,以及重载和参数推断的时候,某些情况下很容易发现数组和指针不是一个类型,因为这种隐式的类型转换并不是所有时候都会自动应用。

至于说到数组是常指针,现在就很容易明白真实原因了。因为数组类型没有定义赋值操作这种运算,而且和指针也不是同一种类型,当然不能赋值了:)就算有类型转换也不行,比如
float f; ((int)float) = 0;
这样的赋值显然不正确,类似
a+b = c;
也是不正确的赋值。因为类型转换和表达式求值的而结果都是右值,简单的说是编译器产生了一个无法引用的临时变量存放结果,当然不能给他赋值了,所以
int *p = 0;
static_cast<int*>(a) = p; //static_cast<int*>(a)在这里相当于(int*)a
也是不正确的,这样数组看起来好像就是常数指针了。

国内的教材和老师为了让学生一下子记住数组的使用,不求理解,而且容易讲,一般都会说数组名是个常量指针。如果看一些外国的教程的话,如c++prime之类,都会强调数组是一种类型,不同于指针。

这样为什么sizeof能表示整个数组的长度就没问题了吧,因为数组本来就是一种具有自己独立属性的类型嘛。
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-11-05
这是C语言的规定,如果a是一个静态数组,那么sizeof(a)就返回整个数组a占用的空间
第2个回答  2008-11-05
数组名虽然可以当做常指针使用,但和指针还是有区别的,数组指向的区域的大小是不能改变的,所以可以得到它的size,且数组名这个指针是不占空间的,指针的指针的size则是指针本身的字节数。这是语言的规定。
第3个回答  2008-11-05
这是C语言的规定,如果a是一个静态数组,那么sizeof(a)就返回整个数组a占用的空间
假如sizeof(a+2) 那么就是4 这个时候a就当作指针用了

有关C++指针和数组的一个小问题
数组是一种类型,独立的类型,不是什么指针或者地址。所谓数组名能作为数组首地址,是因为c++进行了隐式的类型转换。就好像 char c = 'a';int i = c;一样,其实是int i = static_cast<int>(c);,只不过char类型被隐式转换成int不需要写出来。所以数组作为地址时c++其实做的是int *p=static_...

关于c++指针的问题请高手赐教
1、表达式中的数组名(与声明不同)被编译器当作一个指向该数组第一个元素的指针 因此如a[i]这样的访问都被编译器改写或解释为*(a+i)的形式,同样取下标操作符的操作数是可交换的,所以a[3]可以写成3[a],不过通常你不会这样做。2、下标总是与指针的偏移量相同,下标*sizeof(元素类型)就是偏...

请教C++二维数组和指针的简单问题。
主要是明白*s[2]这个是什么。其实有两个操作符,一个是解引用操作符*;另外一个是下标操作符[]。查一下优先级吧。应该先是下标操作所以*s[2]变成了*(s[2])。那么s[2]是什么呢?其实由定义char s[4][6]可以明白。s中存放的是指向字符串的指针。s[2]是一个指针,指向一个字符串。由下标...

c++问题,指针和数组
1、"int coats(10);*(coats+4)=12,指针是不是指向数组第五位元素"?回答"不是"。因为指针指向的是首元素,而+4以后是对编号为4的第五个元素操作。2、"*coats=&coats(4)这样的结果,(括号不要管)"也是不对的。因为*coats表示的是编号为0的首元素值(coats[0]),应该是*coats==...

c++指针与数组首地址的问题!
在具体一点: 假设数组的首地址是INDEX1(那么INDEX1就是a[0]的地址了~), 那么这个值存在a中, 而a放在地址为INDEX2的内存位置, 其值为INDEX1 p=a 结果为 p=INDEX1, 这个是你想要的 p=&a 结果为 p=INDEX2, 这个不是你要的吧 p=&(a[0]) 结果为 p=INDEX1, 也行 个人理解, 如有...

有关c++中数组与指针的关系
1,数组是一块内存连续的数据。2,指针是一个指向内存空间的变量。对于数组来说,数组的首地址,也可以用指针来表示操作,如:int a[10];int *p,n;p = a;对第一个元素取值,可以用几种方法:n =a[0];n = *p;n = p[0];n = *(p+0) ;3,不同的地方是数组是由编译器分配的空间,...

C++ 给数组指针赋值的一些问题?
C++ Primer中提到过,定义数组的名字看成一个指针,也就是说我现在这样定义一个数组 int ia[5];当我单独使用ia的时候,一般情况下它就是一个指针。(只有使用decltype的时候是数组类型)。ia默认指向第一个元素,使用下标是可以递增元素。例如:auto p = ia;p的类型为int*,指向ia的第一个元素,...

关于c++中指针数组赋值时的迷惑
P[1]=new int(x2);P[2]=new int(x3);对于此指针数组中的元素 p[0]p[1],p[2]动态分配内存,动态分贝内存就是使该指针有一个合法的地址,指针也就有了一个确切的指向。char p[6]={"Orange","Pear","Banana","Peach","Apple","Guava"} 字符串有其特殊性,字符串末尾以‘\\0’作为...

C++ 数组与指针
由于b是指针,无论是否指向a,指向什么,sizeof(b)等于sizeof(int),32位平台上等于4。以上讨论的问题引发的关于数组名称的问题:数组名本身是个地址常量,但是某些特殊情况下它的语义可以发生改变。例如sizeof(a),这时a表示整个数组对象(这里指语法对象,不是指类的实例)而不是这个常量本身。基于...

c\/c++中的指针的应用及注意问题
大家注意int *b[2]和int(*b)[2]是不同的,int *b表示一个指针数组,而int (*b)[2]表示含有两个元素的int指针,这里要注意运算优先级问题,有助于理解指针问题。在这里大概介绍基本概念就够了,至于具体使用方法,如赋值等,很多书都有介绍,我就不多说了。二、应用以及注意的问题1、 理解...

相似回答