数组名称与指针的关系

数组名称与指针的关系

初学指针的时候就知道了数组名可以作为指针使用,但是并未对其深究。最近做测试有些与之有关的题目,引发了我对数组名的更深思考,查资料之后有了更深理解,遂写在这里方便保存。(参考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,俨然是一个指针的内存大小。

这是因为在函数内,数组名作为形参失去了其内涵,仅仅是一个指针

失去了内涵,那么它同样可以被修改。

posted @ 2021-12-15 15:50  孟夏十二  阅读(429)  评论(0)    收藏  举报