1.把数组作为参数传递的时候,会退化为指针
数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;
很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。
典型的情况是
void func(int A[])
{
//sizeof(A)得到的是4bytes
}
int main()
{
int a[10]; //sizeof(a) 得到的结果是40bytes
funct(a);
}
2、数组名可作为指针常量
根据结论2,数组名可以转换为指向其指代实体的指针,所以程序1中的第5行数组名直接赋值给指针,程序2第7行直接将数组名作为指针形参都可成立。
下面的程序成立吗?
int intArray[10];
intArray++;
读者可以编译之,发现编译出错。原因在于,虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。
而指针,不管是指向结构体、数组还是基本数据类型的指针,都不包含原始数据结构的内涵,在WIN32平台下,sizeof操作的结果都是4。
顺便纠正一下许多程序员的另一个误解。许多程序员以为sizeof是一个函数,而实际上,它是一个操作符,不过其使用方式看起来的确太像一个函数了。语句sizeof(int)就可以说明sizeof的确不是一个函数,因为函数接纳形参(一个变量),世界上没有一个C/C++函数接纳一个数据类型(如int)为"形参"。
3
对于问题:为什么用strcpy()函数时,
用----------------
char a[3] = "abc";
strcopy(a,"end");
-------------------没有错。
用-----------------
char *a = "abc";
strcopy(a,"end");
------------------运行时就有错呢?
解释如下:
char *a = "abc";
abc"是一个字符串常量,有它自己的存储空间,因为分配在只读数据块,我们无法直接访问。
这样赋值后,a只能读,不能写
所以strcpy(a, "end")不行
只有当你为a分配非常量的存储空间后才行
如:
char *a = new char[4];
strcpy(a, "end");
printf("%s", a);
delete []a;
4//main.cpp
int array[3] = {7, 8, 9}; //全局变量
int main()
{
Test1();
Test2();
return 0;
}
//Test1.cpp
extern int array[3];
void Test1()
{
cout << array[1] << endl;
}
//Test2.cpp
extern int *array; //这个地方是不同的
void Test2()
{
cout << array << endl;
cout << array[1] << endl;
}
Test1()和Test2()的输出结果相同吗?