首页 > 代码库 > 数组名和数组名取地址、指针数组和数组指针的区别
数组名和数组名取地址、指针数组和数组指针的区别
一,首先我们先分析下数组名和数组名取地址的区别。
我们都知道数组名是数组的首地址,然而对数组名取地址又是什么那?看下面一段程序你就会懂的。
#include "stdafx.h"
#include<stdio.h>
using namespace std;
void main()
{
int a[5];
printf("%d\n", a);
printf("%d\n", &a);
printf("%d\n", a + 1);
printf("%d\n", &a + 1);
printf("%d\n", &a[0] + 1);
printf("接下里判断下数组a和&a的字节大小\n");
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a));
while (1);
}
分析:由运行结果可知,数组名a和&a的内存地址相同,我们已经知道a=&a[0],所以有a+1指向数组中下一个元素(即为在首地址2751180基础上加int的字节数4)。
然而&a代表的不是取常量a的地址,而是取数组的地址。虽然a和&a的内存地址相同,但是他们的意义不相同,前者仅代表数组的首地址,后者代表整个数组的,他的进价单位是整个数组的字节长度(4*5=20),所以&a+1的内存地址为2751200。另外当用sizeof时,由于它是个关键字,而不是函数,所以数组不会自动转换为指针,得到的结果都是数组的长度(4*5=20)。PS:如果是(int)a+1则结果是27511801;
二,数组指针和指针数组的区别。
数组指针 int (*Parray)[10]=&arr;首先()优先级比较高,所以Parray是一个指针,指向一个整形的一维数组,数组的长度为10,比如int arr[10]={0,1,2,3,4,5,6,7,8,9};
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组 int *Parray[10] []优先级高,先与Parray结合成为一个数组,再由int*说明这是一个整型指针数组,它有10个指针类型的数组元素,
数组名和数组名取地址、指针数组和数组指针的区别