數組指針和指針數組


指針數組與數組指針

數組指針(指針)

定義 int (*p)[n];
()優先級高,首先說明p是一個指針,指向一個整型的一維數組,這個一維數組的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型數據的長度。

#include <stdio.h>
int main()

{
//一維數組

int a[5] = { 1, 2, 3, 4, 5 };

//步長為5的數組指針,即數組里有5個元素

int (*p)[5];

//把數組a的地址賦給p,則p為數組a的地址,則*p表示數組a本身

p = &a;

//%p輸出地址, %d輸出十進制

//\n回車

//在C中,在幾乎所有使用數組的表達式中,數組名的值是個指針常量,也就是數組第一個元素的地址,它的類型取決於數組元素的類型。

printf("%p\n", a); //輸出數組名,一般用數組的首元素地址來標識一個數組,則輸出數組首元素地址

printf("%p\n", p); //根據上面,p為數組a的地址,輸出數組a的地址

printf("%p\n", *p); //*p表示數組a本身,一般用數組的首元素地址來標識一個數組

printf("%p\n", &a[0]); //a[0]的地址

printf("%p\n", &a[1]); //a[1]的地址

printf("%p\n", p[0]); //數組首元素的地址

printf("%d\n", **p); //*p為數組a本身,即為數組a首元素地址,則*(*p)為值,當*p為數組首元素地址時,**p表示首元素的值1

printf("%d\n", *p[0]); //根據優先級,p[0] 表示首元素地址,則*p[0]表示首元素本身,即首元素的值1

printf("%d\n", *p[1]); //為一個絕對值很大的負數,不表示a[1]...表示什么我還不知道




//將二維數組賦給指針

int b[3][4];

int(*pp)[4]; //定義一個數組指針,指向含4個元素的一維數組

pp = b; //將該二維數組的首地址賦給pp,也就是b[0]或&b[0],二維數組中pp=b和pp=&b[0]是等價的

pp++; //pp=pp+1,該語句執行過后pp的指向從行b[0][]變為了行b[1][],pp=&b[1]


int k;

scanf_s("%d", &k);

return 0;

}

所以數組指針也稱指向一維數組的指針,亦稱行指針。

指針數組(數組)

定義 int p[n];
[]優先級高,先與p結合成為一個數組,再由int
說明這是一個整型指針數組,它有n個指針類型的數組元素。這里執行p+1是錯誤的,這樣賦值也是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指針變量可以用來存放變量地址。但可以這樣 p=a; 這里p表示指針數組第一個元素的值,a的首地址的值。
如要將二維數組賦給一指針數組:

#include <stdio.h>
int main()
{

int a = 1;
int b = 2;
int *p[2];
p[0] = &a;
p[1] = &b;


printf("%p\n", p[0]); //a的地址

printf("%p\n", &a); //a的地址

printf("%p\n", p[1]); //b的地址

printf("%p\n", &b); //b的地址

printf("%d\n", *p[0]); //p[0]表示a的地址,則*p[0]表示a的值

printf("%d\n", *p[1]); //p[1]表示b的地址,則*p[1]表示b的值


//將二維數組賦給指針數組

int *pp[3]; //一個一維數組內存放着三個指針變量,分別是p[0]、p[1]、p[2],所以要分別賦值

int c[3][4];

for (int i = 0; i<3; i++)

	pp[i] = c[i];


int k;

scanf_s("%d", &k);

return 0;

}

還需要說明的一點就是,同時用來指向二維數組時,其引用和用數組名引用都是一樣的。
比如要表示數組中i行j列一個元素:

*(p[i]+j)
*(*(p+i)+j)
(*(p+i))[j]、p[i][j]

優先級:()>[]>*


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM