1、兩種情況下,一維數組不是指向數組首元素地址的指針
int arr[5] = { 1, 2, 3, 4, 5 };
//除了兩種特殊情況下,一維數組名稱都是指針首元素的地址
//特殊情況1: 對數組名稱 進行sizeof
printf("sizeof arr = %d\n", sizeof (arr)); //20
//特殊情況2: 對數組名稱 取地址
//int * p = &arr; //這裏會報錯,因爲p的類型時int *, arr的類型時int (*)[5]
printf("%d\n", &arr);
printf("%d\n", &arr + 1); //可以看到兩次輸出的地址相差20,也就是整個數組的大小
這裏看一個經典的題目, 數組名a與&a的理解
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int* ptr=(int*)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
system("pause");
return 0;
}
答案:2,5
解析:
int* ptr=(int*)(&a+1);&a爲數組a的首地址,對指針加1操作,得到的是下一個元素的地址,而不是原有地址值直接加1,所以&a+1則爲&a的首地址加5*sizeof(int),顯然當前指針已經超過了數組的界限。將上一步計算出來的地址,強制轉換成int*類型,賦給ptr。
*(a+1);a,&a的值是一樣的,但意思不一樣。a是數組首元素的首地址,也就是[0]的首地址,a+1是數組下一個元素的首地址,即a[1],&a+1是下一個數組的首地址。所以輸出2
*(ptr-1);因爲ptr是指向a[5],並且ptr是int*類型,所以*(ptr-1)是指向a[4],輸出5。
2、除了兩種特殊情況外,都是指向數組中首元素的地址的指針
int * p = arr;
p = p + 3;
// []裏面可不可以放負數 可以!!
printf("%d\n", p[-1]);
printf("%d\n", *(p - 1));
從這個例子中也可以看出,訪問數組元素的時候,下標可以是負數
3、數組名--- 指針常量,指針的指向不可以修改
int arr[] = {1, 3, 5, 7, 9}; //數組名做指針的解讀的時候,int * const arr;
4、int[] 與int *是等價的
void printArray( int arr[], int len )// int arr[] 等價於 int * arr
{
for (int i = 0; i < len;i++)
{
//printf("%d\n", arr[i]); // 給人看
printf("%d\n", *(arr + i)); //給機器看
}
}