C語言數組指針_3


C語言中的數組指針與指針數組:

·數組指針
一、區分

首先我們需要了解什么是數組指針以及什么是指針數組,如下:

int *p[5];
int (*p)[5];
數組指針的意思即為通過指針引用數組,p先和*結合,說明了p是一個指針變量,指向一個大小為5的數組。所以,int (*p)[5]即為一個數組指針。int *p[5]則是一個大小為5且存放整型指針的數組。

二、數組元素的指針

1.定義

指針變量既然可以指向變量,同樣的,也能指向數組元素,因此,數組元素的指針就是數組元素的地址。

它的寫法為:

int *p=arr;
int *p=&a[0];
這邊我們需要再次明確,數組名並不代表整個數組,只是代表數組首元素的地址,因此上面兩個語句是一樣的。

2.運算

由於指針指向的是一個地址,因此數組指針也同樣可以進行相關運算;例如指針的加減可以實現指針指向數組上一個或者下一個元素的功能。這邊需要說明,數組指針中進行乘法和除法是沒有意義的。

如下圖所示:

 

 

 

在定義指針變量的時候需要定義類型,如果指針p指向了一個數組中的一個元素,那么p+1並不是將地址加上1,而是系統判定類型之后加上一個數組元素所占用的字節數(即為p+1*d)。

3.通過指針引用數組元素

代碼如下圖:

#include<stdio.h>
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
int *p;
for(p=a ; p<(a+10) ; p++)
{
printf("%d ",*p);
}
printf("\n");
return 0;
}
先讓指針p指向a數組的首元素,打印*p(即指向數組的值),然后執行p++,使得p指向下一個元素,直到輸出數組的十個元素為止。

三、通過指針引用多維數組

1.多維數組元素的地址

我們以二維數組為例,首先需要明確一點的是二維數組的首元素地址並非一個單個元素,而是首行的地址,如下圖:

 

 

下面我們列出相關地址的表示方式:

 

 

表示形式 含義
a     二維數組名,指向a[0]
a[0], *(a+0), *a 0行0列元素地址
a+1, &a[1] 1行首地址
a[1], *(a+1) a[1][0]的地址
a[1]+2, *(a+1)+2, &a[1][2]
a[1][2]的地址

*(a[1]+2), *(*(a+1)+2), a[1][2] a[1][2]的值
上圖都是二維數組中地址的不同表示形式。

2.指向多維數組的指針變量

 
輸出每一個值依然可以像一維數組一樣,但這里我們可以介紹一種新的方法:

int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p)[12];
int i=0;
p=&a;
printf("%d\n",(*p)[11]);
return 0;
}
就像我們前面的例子一樣,int(*p)[12]表示定義一個指針變量,它指向一個包含12個整型元素的一堆數組。我們將其設定為12便可以存下整個a數組,當然也可以存一行4個,最后如果輸出的話就方便了許多。

四、數組指針作函數參數

下面是幾種傳參的方式:

void test()
{
int arr[3][5] = {0};
print(arr);
}
void print(int arr[3][5])
{}
void print(int arr[][5])
{}
void print(int **arr)
{}
void print(int (*arr)[5])
{}
我們可以看出第三種方式明顯是不行的,這邊引用了一個二級指針,但是我們上面提到過數組的地址應該放到數組指針中去。而第四種方法就是我們上面提到過的,而這種方式是可行的。

下面是一個一級指針傳參的例子:

#include <stdio.h>
void print(int *p, int sz)
{
int i = 0;
for(i=0; i<sz; i++)
{
printf("%d\n", *(p+i));
}
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9};
int *p = arr;
int sz = sizeof(arr)/sizeof(arr[0]);
print(p, sz);
return 0;
}
·指針數組
一、指針數組

1.定義

 

int *p[5];
上面使我們剛開始舉出的例子,這就是一個最簡單的指針數組。因此我們可以得出指針數組的定義。指針數組:一個數組的元素均為指針類型數據,稱為指針數組。

假設我們定義一個數組,各個元素指向不同的字符串,如下圖:

 

 

上圖所示,我們定義一個指針數組arr,然后把各字符串的地址賦給各個元素,即arr[0]和arr[1]。

 

通過一個簡單的函數就可以進行輸出了。

二、指向指針數據的指針

首先我們可以定義一個指向指針數據的指針變量:

char **p;
為了方便我們理解,其實**p也就等於*(*p)。*p表示p為一個指針變量,前面的*表示*p指向的是char *類型的數據。換一句話來說,如果引用*p,就是得到p所指向的值,如果拿上面的例子來說就是字符串"Hello"和"World"。

我們可以通過下面的代碼來實現:

int main()
{
char *arr[]={"Hello","World"};
char **p;
int i;
for(i=0; i<2; i++)
{
p=arr+i;
printf("%s ",*p);
}
return 0;
}
參考博文:

 

指針數組與數組指針詳解:

https://blog.csdn.net/men_wen/article/details/52694069

 

C語言指針詳解(經典,非常詳細)

https://blog.csdn.net/constantin_/article/details/79575638


免責聲明!

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



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