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出现在函数声明中,所以它实际上是一个指针,它并不是“一个指向字符串的指针数组”,而是一个可以获取“一个指向字符串的指针数组”的首地址值的变量。楼主,请结合我前面的讲解,仔细体会我前面这句话的意思。国内的教材不知道怎么写的,把别人越讲越晕。如果不明白,尽管发消息问我。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-05-06
1、数组的首地址,在同一计算机上,正常运行的情况下,这个地址是不会变的。
2、数组的首地址,在不同的计算机,不同的系统上,一般情况下这个地址会变的。
3、现代操作系统的内存管理使用的是虚拟内存技术,一般来说,习惯性的讲内存看作是一个大的字节数组,每一个字节都有一个内存地址,本身虚拟内存地址的变化在同一台计算机上基本不大,但是实际的物理内存地址,变化肯定是很大的。问题中所说的数组的首地址,本质上是虚拟内存地址,因此才有1和2中的描述。
第2个回答  2006-12-28
数组有两种定义方法:
1.int a[];
2.int *a;
这两种差不多是等价的,也就是说,2中的a=1中的a,因为a就是一个地址。
比如在1中访问元素是a[5];
那么在2中访问元素是*(a+5);
这两种访问是等价的!
要好好理解指针的定义才能弄明白,因为要记住,数组名就是一个指针,指针的内容是数组第一个元素的地址!
你说的argv++在这里是a++,就是相当于在数组中的a[i++];
也就是说a[i++]=*(a++),可以上机实践一下
第3个回答  2006-12-28
任何数组的数组名 都可以进行 argv++ 的操作吧
数组名代表的 是一个在数组初始化时指向数组首地址的一个指针
argv++ 不过是把这个指针指向的地址 移向内存中的下一个地址
就这样而已
第4个回答  2006-12-28
数组名不能改变(是指针常量)

argv不是数组名。比如声明为如下形式 char * argv[],argv是指向字符串数组的指针。

c语言中数组名代表数组首地址,它的值在运行期间可以改变吗?
数组名是数组的首地址,就是数组中第一个元素的地址,是常量。常量是不能出现在赋值号=左边作为左值的。楼上的都没有解释清楚,说数组名就是指针是错误的,指针是变量,是用来存储变量地址值的变量,而数组名是常量。一般情况下声明一个数组,比如char a[10];之后,数组名a都是数组的首地址,是一...

C语言中,数组名作为函数参数,属于什么传递,为什么?
属于地址传递,在函数里修改的话,将直接影响调用方的数值。这是因为数组名代表这个数组的首地址,不过是静态不可更改的而已。在函数里用引用[i]下标时,就是找到这个数组第i号元素的地址进行修改的。所以是第于是地址传递。

c语言中 int aa[ ]是什么意思?aa[ i ]?
int aa[ ]中,aa表示数组名,代表数组的首地址,可以看成一个常量,不可更改。数组的定义形式:元素数据类型 数组名 [ 数组元素个数 ] ;其中:中括号是数组的标识。括号中的数组元素个数在有初始化数据时,可省,按初始化实际数据个数分配数组空间。如: int aa[]={1,2,3,4,5}; \/\/aa...

c语言中数组名是什么意思
C语言中,数组名是一个不可变的指针常量,不能对它进行加、减和赋值运算。在C语言中规定,数组名是代表该数组的首地址且符合标识符书写规定的变量标识符。不能对它进行加、减和赋值运算。整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10],设数组c的首地址为2000,也就是说c[...

为什么c语言中,数组名是一个地址常量,不能对它进行赋值运算
在最终的汇编结果中,数组名只是一个标号,对应一个地址,在程序中使用数组就是要替换成这个起始地址,因此作为标号本身是不可以修改的,也不是一个变量。用数组名进行计算就是用数组起始地址计算,但不可以给数组名重新赋值

“数组名代表的是数组所占存储区的首地址,其值不可改变 ”这句话什么...
一、变量在内存中是由若干个相邻的“房子”拼接而成的,而数组在内存中则是由若干个相邻的数组元素按顺序拼接而成的。每个数组元素又相当于一个变量。左图是一个大小为3的短整型(short)数组在内存中的情况。二、在上一节的最后说到可以省略数组的大小,但是这样一来我们就无法得知数组的大小了,这...

数组名代表的是数组所占存储区的首地址,其值不可改变 这句话什么意思...
2016-07-28 数组名是一种常指针(不能修改)其值等于数组占据内存单元的首地... 1 2006-12-31 c语言中数组名代表数组首地址,它的值在运行期间可以改变吗? 99 2016-07-24 数组名是一种常指针(不能修改),其值等于数组占据内存单元的首... 2012-09-16 以下叙述中错误的是 1 2015-03-22 求C语言...

C语言数组变量的值不能改变什么意思?我们用 array[a][b]=array[b][a...
数组名为a,可以拿它当成指针来用数组名是地址,但这个地址是固定不能被程序改变的,指针变量有自己的存放地址,可以修改,指针在使用时,与数组名差不多用法a[4]不是数组名,只是数组声明语句中表示数组名a对应的数组有几个元素,数组名是一种常量的表示法,而你文中类型标示符*变量名是指针变量的...

C语言能直接用一个数组名对数组进行赋值吗
回答:不可以,在int a[];时已经为数组在内存中开辟了空间,就是数组a和b的地址已经定下了,在C中,数组一旦在内存中被创建是是固定不变的,直到被取消,a=b,把b的地址给a是不行的。

为什么数组名不能为左值,不能赋值
数组名是数组的首地址,是一个常量,可以给该地址的内存单元(数组第一个元素)赋值,不能改变该常量,常量没有内存空间存你要赋的值。和指针的区别:指针本身也是一个变量,在内存中有自己的空间,来存放所指向内容的地址。所以指针可以为左值,数组名不可以 ...

相似回答