标题问题:
在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;
}
结果为
补充:
严谨的角度来看,数组名是常量指针,(符号常量)数组名指向一段数组开辟连续空间。