c语言之——指针数组与数组指针
一、指針數組和數組指針的定義
1. 指針數組:是指一個數組里面裝著指針,也即指針數組是一個數組;
定義形式:int *a[10];
說明:[]的優先級高于*,該定義形式應該理解為:int * (a[10]);括號里面說明a是一個數組,包含了10個元素,括號外面說明每個元素的類型為int *。
如圖所示:
2. 數組指針:是指一個指向數組的指針,它其實還是一個指針,只不過是指向數組而已;
定義形式:int (*p)[10]; 其中,由于[]的優先級高于*,所以必須添加(*p).
說明:括號中的*表明 p 是一個指針,該指針變量保存的是一個數組的首地址,它指向一整個數組(),數組的類型為int[10],這正是 a 所包含的每個一維數組的類型。
在32位系統下任何類型的指針所占內存大小都為4個字節,至于它指向的數組占多少字節,具體要看數組的大小。總之,數組指針即為“指向數組的大小”
?
總結:主要看后面的兩個字是什么(前面是修飾作用),因此指針數組是數組,而數組指針是指針。
?
二、指針數組和數組指針的使用
1. 指針數組的使用
(1)最簡單的使用方式:
#include <stdio.h> int main(){int a = 16, b = 932, c = 100;//定義一個指針數組int *arr[3] = {&a, &b, &c};//也可以不指定長度,直接寫作 int *arr[]//parr 是指向數組 arr 的指針,確切地說是指向 arr 第 0 個元素的指針,//它的定義形式應該理解為int *(*parr),括號中的*表示 parr 是一個指針,括號外面的int *表示 parr 指向的數據的類型。//arr 第 0 個元素的類型為 int *,所以在定義 parr 時要加兩個 *。int **parr = arr;printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);//16, 932, 100printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));//16, 932, 100return 0; }?(2)對多個字符串進行處理:
#include <stdio.h> int main(){char *str[3] = {"c.biancheng.net","C語言中文網","C Language"};printf("%s\n%s\n%s\n", str[0], str[1], str[2]);/*運行結果:c.biancheng.netC語言中文網C Language*/return 0; }解釋:str數組存儲了兩個指針,第一個指針指向了字符串"c.biancheng.net",第二個指針指向了字符串"C語言中文網",第三個指針指向了字符串"C Language"。需要注意的是,字符數組 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的內存區域,和字符數組是分開的。
.
2.數組指針的使用
(1)對于一維數組:
int main(void) {char a[5]={'A','K','C','G','L'};?? ?char (*p)[5]=&a;//&a代表的是整個數組的首地址//char (*p)[5]=a;這樣是錯誤的,因為a代表第一個元素的首地址printf("%c %c %c",**p,*(*p+1),*(*p+3));//輸出:A K Greturn 0; }說明:a代表的是第一個元素的地址,即:&a[0],而&a代表的是整個數組的地址。a+1代表的是下一個元素的地址,即&a[1],而&a+1代表的是向后移動5個字節的地址。這里為什么用的二級指針呢?因為p=&a,*p即為第一個元素的地址,再**p即輸出了第一個元素。同理,*(*p+1),*(*p+3)輸出第二個元素,第四個元素。
(2)對于二維數組:
二維數組用行指針定義
p++操作會使p指向下一行的首地址,這是因為p是行指針,指向的是一行。我們可以用sizeof(*p)測試p指向的內容的大小:
#include <stdio.h> int main() {int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };int(*p)[4];//p指向數組 a 的開頭,也即第 0 行;p+1前進一行,指向第 1 行。int i,j;p=a;for(i=0; i<3; i++){for(j=0; j<4; j++) printf("%2d ",*(*(p+i)+j));//*(*(p+i)+j)表示第 i 行第 j 個元素的值。printf("\n");}/*0 1 2 34 5 6 78 9 10 11*/return 0; }?
?
ref:
https://blog.csdn.net/weixin_41923658/article/details/88066916
https://blog.csdn.net/men_wen/article/details/52694069
https://blog.csdn.net/xia__mu/article/details/99879877
總結
以上是生活随笔為你收集整理的c语言之——指针数组与数组指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可伸缩性和重/轻量,谁是实用系统的架构主
- 下一篇: 区分性训练