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

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

标题问题:

在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

int main()

{

char array[] = "abcde"; //双引号里面字符串会自动补 '\0'

char (*array3)[6] = &array;

printf("array3=%s\n",*array3);

return 0;

}

结果为

补充:

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