提问: 数组名是指针吗?
c语言吧
全部回复
仅看楼主
level 8
欢迎发表各种观点
2007年03月15日 09点03分 1
level 9
数组名是在数值上表示为地址,在类型上表示为 数组。指针在数值上表示为地址,在类型上表示为 指针。两者容易混淆的原因,就在于:1、数组名可以表示数组的地址,指针的值也是地址,在数值上两者相同2、指针可以通过[]来索引数组,在表现形式上与数组相同。
2007年03月15日 09点03分 2
level 9
数组名,不是指针,但在许多场合可以发挥指针的作用(指示地址)。
2007年03月15日 09点03分 3
level 9
5:你考虑的还是不够全面,如下例: char c; char * const p2=&c; p2++;============main.c:14: error: increment of read-only variable 'p2'
2007年03月15日 09点03分 6
level 9
如果说数组名是常量,那为什么数组名还需要声明、定义?另外,对数组名可以进行取地址操作,对常量可以吗?
2007年03月15日 09点03分 8
level 9
这里我跟“C业余爱好者”可能有些误会。他所说的“常量”是不是指的 const int i;这样的?我一般把“常量”理解为“常数”即1,2,3这样的数。也许我的理解跟大家的不一样。
2007年03月15日 09点03分 9
level 8
int array[10];array就是一个"常数", 比如123456, 它用来标示数组的地址.&array的类型是int[], 它是这个数组的地址, 而&array[0]是元素0的地址, 它们在数值上相同, 但表示的意义不同.可以这么理解否?
2007年03月15日 10点03分 10
array并不一定常数,如果是放在全局变量区,那么编译器即可确定地址,如果放在局部变量区,那么不运行起来是不知道地址的。
2017年02月15日 00点02分
level 9
我不认为array是常数。我觉得把它当成 只读变量 似乎更恰当一些。比如:const int i;这样的。
2007年03月15日 10点03分 11
level 8
呵呵, 我们先来确定一个问题好不好, array == &array[0], 它们的意义相同.&array是数组的地址, 在数值上与array, &array[0]相同, 但意义不同.
2007年03月15日 10点03分 12
level 7
一个很欠K的说法:&array和array/&array[0]的不同是用来对付编译器的类型检查的(不过编译器有这方面的类型检查么?)
2007年03月15日 12点03分 13
level 8
不欠K哦不欠K, 你说的很对对哦, 哦.............汇编下完全是相同的指令: lea XXX, XXX.........
2007年03月15日 12点03分 14
在这里谈汇编没有意义,写编译器的时候最后一两个阶段才会与汇编对接,而类型检查在第三阶段就完成了。
2017年02月15日 00点02分
level 6
int a[10] = {1,2,3,4,5,6};int *p = a;printf("%d",p[0]);这是可以通过运行的,我想问的是既然p被定义了指针类型,那么出现类似的p[0]这样一类数组的下标为什么程序不出错呢.
2007年03月15日 12点03分 15
level 7
C99规定,E1[E2]被解释为*((E1)+(E2))所以说……a[5]也可以写成5[a]……
2007年03月15日 13点03分 16
level 0
前几天在c语言吧的http://post.baidu.com/f?kz=180796674讨论的一个问题中也有关于数组和指针的,充分说明了数组名不能等同于指针.
2007年03月16日 02点03分 17
level 8
对于数组, 是否有额外的开销(也许是内存, 编译时间, 或者其它)
2007年03月16日 02点03分 18
高维数组和高维指针模拟的数组,内存占用是不一样的,前者是一段连续的存储空间,后者需要为每一级构建指针。即便是一维数组和一维指针,运算也是不一样的。 举个例子:typedef int (*A)[10]; int *p = NULL; (int)(p+1) == 4; 而(int)((A)p+1) == 40;
2017年02月15日 00点02分
level 9
    数组, 不一定有额外的开销.如果认为数组一定比指针有额外的开销,那对数组就不公正了,    也就是说,有时恰恰相反,数组比指针要节省空间,17l的例子就证明了了这一点.    指针变量*p,被动态的专门开辟一个空间存放"hello"的首地址;    而和指针起相同作用的可以是使用静态数组static char a[],这时a[]的首地址和常量字符串"hello"的首地址是一致的;也就是说,数组节省了一个存放地址的存储空间.毳毛其次,赫赫...........
2007年03月16日 02点03分 19
level 8
呵呵, 是我没把问题说清楚, int a[10];int *p = &a;sizeof(a) = ?sizeof(p) = ?反汇编中a的大小直接写的立即数, 那么这个立即数怎么得来的呢?有另外的内存开销, 记录了a的大小, 我没找到具体的证据, 我也觉得编译器不会这么实现.那么是通过偏移地址? 我倾向于此, 但同样没有找到确切的证据.....
2007年03月16日 03点03分 20
这个立即数是编译期计算出来的,对于C语言,编译期可以计算出任意类型的大小,然后塞到汇编码里,来加速,这里没有另外的开销,因为这是一个编译期常量。 但是a的基地址未必是编译期常量,这一点取决于a是在哪定义的,以及以什么样的修饰符定义的。 这些东西,翻翻C的标准就知道了。
2017年02月15日 00点02分
level 9
哦,搞 差啦,呵呵..........int a[10];一般说来,汇编中a的大小用立即数20来说明想来这个数字编译器可以直接从原程序中得来的..........动态分配的数组嘛....
2007年03月16日 03点03分 21
level 8
liupengty呀, 20这个数不是凭空掉下来的哈, 编译器也需要计算吧, 我就是不确定它是根据什么计算出来的, 给我汇编代码最好, 当然, 这也许难为你了..........
2007年03月16日 03点03分 22
orz~,2007年,坟贴怎么跑上来了。
2017年02月15日 00点02分
level 9
除了我在2楼说的两条,数组和指针再无相同之处。int a[10];sizeof(a)是 10*sizeof(int)int *p = &a;sizeof(p)是 sizeof(指针)。sizeof操作符是在编译的时候就确定的,并不是运行时。怎么计算出来的?你都说了是int [10]了,编译器当然知道怎么计算了。
2007年03月16日 04点03分 23
1 2 尾页