c语言中数组名代表数组首地址,它的值在运行期间可以改变吗?

分类: 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出现在函数声明中,所以它实际上是一个指针,它并不是“一个指向字符串的指针
数组”,而是一个可以获取“一个指向字符串的指针数组”的首地址值的变量。楼主,请结合我前面的讲解,仔细体会我前面这句话的意思。国内的教材不知道怎么写的,把
别人越讲越晕。如果不明白,尽管发消息问我。 
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 C 语言,可以使用静态数组来创建一个大小为 10 个整型的数组,而不使用 malloc 函数。 例如,可以使用如下方式声明一个静态数组: int array[10]; 这将创建一个为 array 的大小为 10 的整型数组。您可以通过使用下标访问数组的每个元素,例如: array[0] = 1; array[1] = 2; 等等。 注意,如果您需要在运行时动态地分配数组的大小,则可能需要使用 malloc 函数。 ### 回答2: 在C语言,可以使用静态数组来代替使用malloc函数来创建一个大小为10个整型的数组。静态数组是指在程序运行前就已经分配好固定大小的数组空间,不需要再动态分配。 要创建一个大小为10个整型的数组,可以在函数外部或者局部变量声明一个全局或者局部静态数组。例如: 1. 在函数外部声明全局静态数组: ```c #include <stdio.h> int arr[10]; //声明一个全局静态数组 int main() { // 对全局静态数组进行操作 arr[0] = 1; arr[1] = 2; // 输出数组 for(int i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; } ``` 2. 在函数内部声明局部静态数组: ```c #include <stdio.h> void myFunction() { static int arr[10]; //声明一个局部静态数组 // 对局部静态数组进行操作 for(int i = 0; i < 10; i++) { arr[i] = i; } // 输出数组 for(int i = 0; i < 10; i++) { printf("%d ", arr[i]); } } int main() { myFunction(); return 0; } ``` 无论是全局静态数组还是局部静态数组,它们的空间在程序运行前就已经分配好了,因此不需要使用malloc函数来进行动态内存分配。 ### 回答3: 在C语言,可以使用静态数组来替代使用malloc函数来新建一个大小为10个整型的数组。 静态数组是在编译时分配内存空间的,不需要使用malloc函数来动态分配内存。可以通过以下步骤来创建一个大小为10的整型数组: 1. 在全局范围声明一个数组变量并指定其大小为10。例如,可以使用以下语句声明一个整型数组: ``` int array[10]; ``` 2. 声明完数组后,可以在函数直接使用该数组变量。静态数组的内存空间在程序运行时分配,并且在程序执行期间一直存在。 需要注意的是,静态数组的大小在编译时确定,无法在运行改变。此外,静态数组的生命周期和作用域受限于其声明的位置,也无法在运行时释放分配的内存。 总结起来,可以通过在全局范围声明一个静态数组变量来替代使用malloc函数创建一个大小为10的整型数组。静态数组不需要用malloc函数来分配内存,可以在程序运行时直接使用,并且无需手动释放内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值