c语言 数组名本质为指针常量,以及数组名在哪个区存放,数组空间在哪开辟

文章详细探讨了C语言中数组名的含义,指出数组名实际上是一个指针常量,代表数组首元素的地址,且不可改变。通过示例代码解释了数组名与首元素地址的关系,以及`sizeof`运算符在数组和指针上的应用。同时,强调了数组名作为常量指针的特性,不能在赋值运算符的左侧使用。最后,文章提到了数组指针的使用和其与数组名的区别。
摘要由CSDN通过智能技术生成

标题问题:

   在c语言 数组名代表什么?以及数组名在哪个区存放,数组空间在哪开辟?

先给结论 : 

补充:
指针常量:char * const arr;  指针指向的值可以改变,指针的指向不可以改变。
常量指针:char const *arr;   指针的指向可以改变,指针指向的值不可以改变。

区分:从前往后读 ,先读到*是指针常量,先读到const是常量指针。
eg:
char arr[10] = "abcde";
arr = "cdefg" ; //errro 指针的指向不可以改变
*arr = ‘b’ ; // right 指针指向的值可以改变 数组名代表数组首元素地址。

在ubuntu环境下c语言中 数组名本质是指针常量,代表首元素地址。数组首元素地址和数组首地址有着相同的地址编号。

数组名存放在哪里,数组空间在哪开辟,看它定义的时候是局部变量还是全局变量,有没有malloc函数在堆区空间开辟空间。

简单探究:

1)比较 数组名首元素地址数组首地址     (array  与 &array)

探究数组名  代表的首元素地址编号 和对数组名取地址 代表的数组首地址。

void test01()
{
    int array[5] = {1,2,3,4,5};
    int i=0;
    while(i<5)
    {
         printf("%d\n",array[i]);
         i++;
    }
    printf("array=%d\n",array);
    printf("array=%p\n",array);
    printf("array=%#x\n",array);
    printf("------------------------\n");
    printf("array=%d\n",array);
    printf("array=%p\n",array);
    printf("array=%#x\n",array);
     

}

运行结果:

数组名 代表的首元素的地址 和 对数组名取地址的首地址 在地址编号上相同。

2)用sizeof()看数组首元素地址 和数组首地址

 printf("sizeof(&array)=%lu\n",sizeof(&array));  //数组首地址  测量数组地址的大小  === 8字节
 
 printf("sizeof(array)=%lu\n",sizeof(array));    // 数组首元素地址  测量的是整个数组所占的空间大小

 结果为:

数组名首地址为8字节,仅仅代表了数组的地址,对数组名取sizeof测量的是 数组名所代表的连续空间大小

 3)数组名是常量指针。不能在等号左边。

   等价于 int *const array[ ]      不能被修改指针的指向,可以修改指针内地址所代表的空间内容。

   具有常量的特征无法被赋值,不能在等号左边。若数组名可以被赋值,那开辟数组的数组空间,如果在只有数组的地址没有被其他指针保存。数组名被赋值,则数组所开辟的空间会丢失,发生内存泄漏。

     1】数组名(常量指针)在等号右边 ,给等号左边赋值

void test01()
{
    int array[5] = {1,2,3,4,5};
    int i=0;
    while(i<5)
    {
         printf("%d\n",array[i]);
         i++;
    }
    printf("-----------------\n");
    int *p=array;
    i--;
     while(i>=0)
    {
         printf("%d\n",p[i]);
         i--;
    }
   // int array2[5];
    
}

     2】数组名(常量指针)在等号左边 

void test01()
{
    int array[5] = {1,2,3,4,5};
    int i=0;
    while(i<5)
    {
         printf("%d\n",array[i]);
         i++;
    }
    printf("-----------------\n");
    int *p=array;
    int array2[5];
    array2 = p;
    
}

结果:

 expression must be a modifiable lvalue --》表达式(expression)必须是一个可修改(modifiable)的左值(lvalue)。

4)数组指针可以在等号左边  (数组指针是指针变量,而不是数组)

#include <stdio.h>

int main()
{
	char array[] = "abcde";  //双引号里面字符串会自动补 '\0' 
	char (*array3)[6] = &array;
    printf("array3=%s\n",*array3);
	
	return 0;
}

结果为 

补充:

 严谨的角度来看,数组名是常量指针,(符号常量)数组名指向一段数组开辟连续空间。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值