数组名与指针

来源:互联网 发布:javascript高级 编辑:程序博客网 时间:2024/04/26 20:44

指针是C/C++语言的特色,而数组名与指针有太多的相似,这导致数组名被误解为就是指针。
编程中某些时候这样的理解是很危险的。
如果把数组理解为基本数据类型中的一种,许多事情就好办了,数组名就是个数组类型的变量名。
int ary[10] = {0, 1, 2, ...};
int a;
那么ary就是个int[10]类型的变量名,下面的a就是个int类型的变量名。
int (*ptr)[10];//定义了一个int[10]类型的指针
int *iptr;//定义了一个int类型的指针
ptr = &ary;//正确,取ary的地址给这个指针赋值
//iptr = &ary; //编译出错,类型不匹配
iptr = ary;//正确,数组名的值(不是取地址)是数组第一个元素的地址,这是非常特殊而且重要的一点
//而元素又是int类型,那么它的地址就是int类型的指针
注意:ary的值和ary的地址值(&ary)是一样的,但是类型是不同的
在计算机中,内存中无非就是0和1,对于一个地址,用*号去取它的值,类型起到巨大的作用。
类型决定了变量的大小和作用在它上面的具体操作,即类型决定了内存范围和怎么去解析范围
之间的原始内存0,1数据。
cout << (void *)ary << endl;
cout << (void *)&ary << endl;
cout << (void *)(ary + 1) << endl;
cout << (void *)(&ary + 1) << endl;
看看上面这段程序的输出就会明白ary和&ary的类型是不一样的,所以加1的含义完全是不同的。
void func(int *iptr, int n)
{
  for(int i = 0; i < n; i++)
     cout << iptr[i] << endl;//等同cout << *(iptr + i) << endl;
  cout << sizeof(iptr);//4字节长
}
sizeof(ptr);//40字节长4 * 10个int类型变量
//func(ptr);//可以
func(&ptr);//这样的调用是可以的,这种特殊性是导致对数组名和指针误解的重要原因之一。
注意在调用的过程中ptr从一个数组的地址退化为普通的int类型指针。
在windows 32位平台上,指针变量的长度都是32位,跟指针的类型无关。
所以ptr不是指针它是一个int类型数组变量,只不过有时它的行为像指针而已,但是作为C/C++程序
员,这是应该要知道并且深刻理解的。
还忘了说,ary变量天生就是常量,它是不允许修改的。
比如:
ary++;
ary += 1;
都是非法的,编译错误。