指针与一维数组
数组的名称就代表该数组的首地址,因此数组的名称就是指针常量。
例如:inta[5] = {1,2,3,4,5}
Int * ptr=a;
这里ptr就相当于a,只不过ptr是一个指针变量,而a只是一个指针常量。因此ptr[i]就相当于a[i],ptr+i就相当于&a[i]。*(ptr+i)相当于a[i]
Ptr+i表示的是将当前指针变量的地址加一,也就是下一物理内存的地址。
取一位数组中的元素的几种方式:
a[i]、*(a+i)(a是一个指针常量)、*(ptr+i)、ptr[i]。
指针与二维数组
数组的名称就代表该数组的首地址,因此数组的名称就是指针常量。
可以把二维数组想象成由两个一位数组组成的一个表格:
a[i] a[j] | a[0] | a[1] | a[2] | a[3] | a[j] |
a[0] |
|
|
|
|
|
a[i] |
|
|
|
|
|
因此我们要向得到二维数组中的元素,应该包含两个[]或者是两个*或者是一个*和一个[],除此之外得到的都是地址。形如以下二维数组:
Int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}
int *p = a;
a+i和a[0]+i的区别
a相当于a[0][0],但是a和a[0]加1代表的含义是不同的。a[0]+1代表的是a[0][1],而a+1则代表的是a[1][0],相当于a由于行还未确定,因此当对a进行操作的时候,将对行优先操作。而a[0]+1则由于当前的a[0]代表第一行的首地址,相当于行已经确定,则会对当前行所在的列进行操作,也就是在当前行上增加相应的地址。由于*和[]一共出现两次才能取得正确的元素的值,因此当出现单个*或者[]的时候均表示当前的地址。
*(p+i)和*p+i的区别
*(p+i)和p+i表示的都是第a[i][0]行的地址,而*p则和上面的a[0]+i表示的含义一样,*p表示当前的行地址已经确定,所以在进行*p+i操作时只会在当前行的基础上加上一段内存地址。比如当前的a的首地址为0x00,则a[1]的地址将为oxd(一个整形数据占四个字节),当对a[0]+1时,此时的值为0x00+4=0x4(即为a[0][1]的地址)而对a进行a+1操作时,表示0x00+c(3个int型所占的长度)+1(下一个内存地址)=0xod(a[1][0]的地址)。也就是相当于只有一个*或者是[]的时候只能确定行的地址。