首页 > 代码库 > c语言中数组名的本质

c语言中数组名的本质

c语言中的数组名的本质是什么,数组名是指针吗?

1、数组名是数组元素的首地址
#include <stdlib.h>
#include <stdio.h>
void main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8,9, 10};
printf("a:%d &a:%d :%d \n", a, &a);
system("pause");
}
上面的程序中,a &a大小一样,证明a就是数组元素的首地址;


2、数组名是不是指针,看例子:
#include <stdlib.h>
#include <stdio.h>
void main()
{
char str[10];
char *pStr = str;
printf("sizeof(str):%d sizeof(pStr):%d :%d \n", sizeof(str), sizeof(pStr));
system("pause");

}

上面程序中,运算结果是10和4.
结论:如果数组名就是指针,那么str的值应该是4,而结果却是整个数组的大小10;但是,如果str
不是指针,为什么str能赋值给指针呢?
3、数组名是不是指针的指针
#include <string.h>
#include <iostream.h>
int main(int argc, char* argv[])
{
char str1[10] = "I Love U";
char str2[10];
strcpy(str2,str1);
cout << "string array 1: " << str1 << endl;
cout << "string array 2: " << str2 << endl;
return 0;
}
上例中,strcpy函数在c语言函数库中参数是char类型的指针,在上面的程序中str1和str2被当成了
指针用。
结论:数组名是代表一种数据结构,即数组,数组名可以转化为指向数组的指针,而且是一个常量指
针。
4、数组名可作为指针常量
int a[10];
如果对a进行a++操作,程序会编译出错,因为虽然数组名可以转换为指向其指代实体的指针,但是它
只能被看作一个指针常量,不能被修改。

5、数组名作为函数参数会退化为指针
#include <iostream>
void arrayTest(char str[])
{
 cout << sizeof(str) << endl;
}
int main()
{
 char str1[10] = "I Love U";
 arrayTest(str1);
  return 0;
}

上面的程序中,输出结果为4.
结论:当数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针,而且在函
数体内可以作自增、自减等操作,可以被修改。

在形参里面出现的如char buf[30],int a[10]等c/c++编译器会把它当做指针,也不会主动的多分配
内存,c/c++编译器会自动优化。

6、数组名扩展:
#include <stdlib.h>
#include <stdio.h>
void main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8,9, 10};
printf("a:%d &a:%d :%d \n", a, &a);
printf("a+1:%d &a+1:%d \n", a+1, &a +1 );
}
以上例子a和&a大小一样,说明a是数组首元素的地址,而a+1和&a +1大小不一样,其实质是数据类型
不一样,也就是指针的步长不一样;
char a[20];a代表字符数组元素的首地址,类型为char *,它的步长为1;&a代表也是字符数组的首地
址,类型为char[],步长为20;
char b[10][30];b代表二维数组元素首地址,是个指针,类型为char(*a)[30],步长为30;&b也是二
维数组元素首地址,类型为char[10][30],步长为300;

c语言中数组名的本质