先看下例子
原文链接:https://blog.csdn.net/as480133937/article/details/123512497
#include <stdio.h>
int buf[10];
int *p;
int main()
{
int a=sizeof(buf);
int b=sizeof(p);
printf("a的大小为:%d \n b的大小为 %d\n",a,b);
return 0;
}
buf是一个数组,p是一个指针,正常情况下 大小都应该为4
但是实际的输出确实 a=40 b=4
数组名在某些情况下是不等于指针的,只是在一些情况下会退化为指针
数组名是一个标识符,它标识出我们之前申请的一连串内存空间,而且这个空间内的元素类型是相同的——即数组名代表的是一个内存块及这个内存块中的元素类型
只是在大多数情况下数组名会“退化”(C标准使用的decay和converted这两个词)为指向第一个元素的指针。 而指针不是一种聚合类的数据结构,它保存着某一种类型的对象的地址(void*除外),也说它指向这个对象。我们可以通过这个地址访问这个对象。用一个图来解释,其中a代表了整个我们声明的内存块,p仅仅指向了一个char类型的对象
数组名只有在
sizeof 运算符
取址 & 运算符
字符串常量初始化的数组 Str[]=“abcdef”
这三种情况下不会发生退化(array decay)
其余情况下调用数组名,都会退化成指向数组首地址的指针
数组使用
#include <stdio.h>
void print_1(int *n, int size)
{
printf("数组大小为:%d\n",size);
}
int main()
{
int Number[10];
print_1(Number,sizeof(Number)/sizeof(Number[0]));
return 0;
}