一,首先我們先分析下數組名和數組名取地址的區別。
我們都知道數組名是數組的首地址,然而對數組名取地址又是什么那?看下面一段程序你就會懂的。
#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個指針類型的數組元素,