1. 程式人生 > >指標 陣列 陣列名和陣列名取地址的區別

指標 陣列 陣列名和陣列名取地址的區別

首先指標陣列 和陣列指標叫法本身是種誤導

指標陣列:array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標

陣列指標:a pointerto an array,即指向陣列的指標

其次他們本質一個是陣列,一個是指標

int* a[4]     表示是一個數組     

                陣列a中的元素都為int型指標    

                 元素表示:*a[i]   *(a[i])是一樣的,因為[]優先順序高於*

int (*a)[4]   表示是一個指標     

                 指向陣列a的指標

                 元素表示:(*a)[i]  

#include <iostream> using namespace std; int main() { int c[4]={1,2,3,4}; int *a[4];//指標陣列 int (*b)[4];//陣列指標 b=&c; //將陣列c中元素賦給陣列a for(int i=0;i<4;i++) { a[i]=&c[i]; } //輸出看下結果 cout<<*a[1]<<endl;//輸出2就對 cout<<(*b)[2]<<endl;//輸出3就對 return 0; } ///////////////////////陣列名和陣列名取地址的區別////////////////////////////

char a[20];  

void *b,

char *c; 

 b=&a; //OK  b可以指向任意型別的指標 

雖然&a和a得記憶體地址相同,但它們的意義不相同,它是代表整個陣列的,它的進階單位是整個陣列的位元組長度

c=&a;  //ERR &c返回的是一個指向char陣列的指標, 而c是一個指向char字串的指標

c=(char*)&a; //可以強轉

c=a;  //OK  指向陣列的首元素的地址 即&a[0] 是一個指向char元素的指標

a的型別是int[5]   陣列 &a的型別是int(*)[5]  指標——指向int[5]陣列的指標 &a[0]的型別是int*    指標——指向int型別的指標 #include <stdio.h> int main() { int a[5]; printf("%d\n", a); printf("%d\n", &a); printf("%d\n", a + 1);                          //它的進階單位是
1個int位元組數 printf("%d\n", (int*)&a+1);                    //它的進階單位是1個int位元組數   int(*)[]可以強轉為int*
printf("%d\n", (int*)((char*)&a+sizeof(int))); //它的進階單位是1個int位元組數
printf("%d\n", &a + 1);                        //它的進階單位是整個陣列的位元組長度 printf("%d\n", &a[0] + 1);                     //它的進階單位是1個int位元組數 printf("---------------\n"); printf("%d\n",sizeof(a));  //通過陣列名獲取的是陣列的大小 printf("%d\n",sizeof(&a)); //通過取陣列名獲取的是指標的大小 return 0; }
結果

1244736
1244736
1244740
1244740
1244740
1244756
1244740
---------------
20
4