c语言中数组名代表数组首地址,它的值在运行期间可以改变吗?
2013-04-15 18:36
417 查看
c语言中数组名代表数组首地址,它的值在运行期间可以改变吗?
2009-06-01 15:21:47
分类: C/C++
c语言中数组名代表数组首地址,它的值在运行期间可以改变吗?
问题补充:
最佳答案
2009-06-01 15:21:47
分类: C/C++
c语言中数组名代表数组首地址,它的值在运行期间可以改变吗?
c语言中数组名代表数组首地址,它的值在运行期间是固定不变的,但是在main函数的参数中对指针数组名却可以出现类似于argv++的操作(谭浩强老师的c程序设计中有这 样的程序),这不是前后矛盾了吗?盼高手解决,谢谢。
问题补充:
首先谢谢大家的回答,谭老师的书中写道“main函数的第二个形参是一个指向字符串的指针数组”(也就是argv)。既然它是一个数组,而数组名代表首地址不能改变,也就 不应当出现类似于argv++的操作了
最佳答案
数组名是数组的首地址,就是数组中第一个元素的地址,是常量。常量是不能出现在赋值号=左边作为左值的。楼上的都没有解释清楚,说数组名就是指针是错误的,指针是 变量,是用来存储变量地址值的变量,而数组名是常量。一般情况下声明一个数组,比如char a[10];之后,数组名a都是数 组的首地址,是一个地址常量。但是在函数声明的形参列表中除外。 比如: int foo(char a[10]); 在这种情况下这样的声明与 int foo(char a[]); int foo(char * a); 是等价的,就是说这种情况下,就算你写的是数组的形式,编译器实际处理的时候也当指针来处理(注意指针是变量,形参也是变量,二者刚好对应)。所以在函数foo内部, 你对a进行++, --, +=,=之类的带赋值的操作是完全合法的,因为此时a就是一个指针,不是数组名,当你往函数foo里面传入一个已经事先声明的数组的首地址时候, 指针a里面的值就是你这个已经声明的数组的首地址,这样你在foo里面就可以对你那个数组进行操作,正是因为C有这个传地址的优点,所以省略了很多不必要的拷贝工作, 试想如果没有这个传地址,你传一个有几万个元素的数组进去,那拷贝工作是相当可观的。这样,你该明白了int main(int argc, char ** argv);里面为什么可以对 argv进行++操作了,既然“main函数的第二个形参是一个指向字符串的指针数组”,argv出现在函数声明中,所以它实际上是一个指针,它并不是“一个指向字符串的指针 数组”,而是一个可以获取“一个指向字符串的指针数组”的首地址值的变量。楼主,请结合我前面的讲解,仔细体会我前面这句话的意思。国内的教材不知道怎么写的,把 别人越讲越晕。如果不明白,尽管发消息问我。
相关文章推荐
- c语言中数组名代表数组首地址,它的值在运行期间可以改变吗?
- c语言中数组名代表数组首地址,它的值在运行期间可以改变吗?
- 如果改变了形参数组的值 从而在调用函数期间 形参数组就和实参数组共占同一段内存单元 为什么形参数组从实参数组那里得到起始地址后 请问各位C语言高手:当用数组名作函数参数时 也就该变了实参数组的值
- error C2057: expected constant expression (C语言中数组的大小可以在程序运行时定义吗? )
- error C2057: expected constant expression (C语言中数组的大小可以在程序运行时定义吗? )
- c语言:编辑程序输出取数组地址
- Delphi数组名不代表数组首地址
- C语言数组中的地址偏移问题
- C语言的数组名和对数组名取地址
- VLine[-1]=VLine[width]=128 数组的负一地址代表啥
- c语言中数组中的地址和指针的关系
- 数组名和数组名取地址的区别
- C语言的数组名和对数组名取地址
- 若有定义:int aa[ 8];&aa[0]++不能代表数组元aa[1]的地址,&aa[0]+1 、&aa[1] 、aa+1 都可以表示
- 有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机
- C语言中可以求任意一个int型数组的长度吗?
- C语言 内存分配 地址 指针 数组 参数 实例解析
- 为什么数组可以不加“&”取它的地址,而普通变量必须要加“& ”才可以呢?
- C语言数组首地址问题
- router-link 地址可以改变,但是router-view不渲染