指標 陣列 陣列名和陣列名取地址的區別
阿新 • • 發佈:2019-01-23
首先指標陣列 和陣列指標叫法本身是種誤導
指標陣列: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); //它的進階單位是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