数组名称与指针的关系
数组名称与指针的关系
初学指针的时候就知道了数组名可以作为指针使用,但是并未对其深究。最近做测试有些与之有关的题目,引发了我对数组名的更深思考,查资料之后有了更深理解,遂写在这里方便保存。(参考CSDN LudyYuen)
探究
首先来看以下代码
#include<stdio.h>
int main()
{
int a[10];
int* p=a;
printf("%d\n", sizeof(a));
printf("%d", sizeof(p));
}
如果数组名是指针,
则应该输出 4 4(指针占据空间内存大小)
实际结果输出40 4.
所以数组名不是指针
但是数组名又有像指针的地方,上例*p=a将数组名直接赋值于指针,表现的又像指针,再例如
#include<stdio.h>
#include<string.h>
int main()
{
char A[20] = "I love U";
char B[20];
strcpy(B, A);
printf("%s\n", A);
printf("%s", B);
return 0;
}
C库函数中strcpy函数接纳的是char型指针,但我们给予两个数组名依旧可以正常运行。
输出为
I love U
I love U
数组既有像指针的地方,但又不是指针,那么数组名与指针的关系究竟是什么?
结论
1.数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
2.数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
3.指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址。
1.现在可以解释为什么第一组案例输出的是40而不是4,原因为此时数组名指代的是数组的整体
2.数组名可以当做指针常量
因为数组名可以是指针常量,则其只代表一个指针且不可修改
#include<stdio.h>
int main()
{
int a[10] = { 1 };
int* p = a++;
printf("%d", *p);
}
如上,则会提示不可编译,所以数组名只是一个指针常量,不能修改。
3.数据名可能失去其数据结构内涵
看下面一段程序
#include<stdio.h>
void ceshi(int str[])
{
printf("%d", sizeof(str));
}
int main()
{
int a[10] = { 1 };
ceshi(a);
}
如果数组名代表的是数组整个结构,并且根据第一例,理应输出40,但是这个程序却输出4,俨然是一个指针的内存大小。
这是因为在函数内,数组名作为形参失去了其内涵,仅仅是一个指针
失去了内涵,那么它同样可以被修改。

浙公网安备 33010602011771号