日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++数组指针和指针数组

發(fā)布時(shí)間:2024/2/28 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++数组指针和指针数组 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)組指針和指針數(shù)組的區(qū)別

指針數(shù)組:首先它是一個(gè)數(shù)組,每一個(gè)元素都是一個(gè)指針。

數(shù)組指針:首先它是一個(gè)指針,它指向一個(gè)數(shù)組。它是"指向數(shù)組的指針"的簡(jiǎn)稱。

運(yùn)算符的優(yōu)先級(jí)關(guān)系:()?>?[]?> *

?

數(shù)組指針(也稱行指針)
例如:int (*p)[n];
根據(jù)優(yōu)先級(jí),先看( )內(nèi),p是一個(gè)指針,后面的[ ]又說明了p是一個(gè)指向數(shù)組的指針,由于前面的int,所以p是一個(gè)指向 int 類型數(shù)組的一個(gè)指針。

將二維數(shù)組賦給指針:

int a[3][4]; int (*p)[4]; //該語句是定義一個(gè)數(shù)組指針,指向含4個(gè)元素的一維數(shù)組。 p=a;??????? //將該二維數(shù)組的首地址賦給p p++;?????? //該語句執(zhí)行過后,也就是p=p+1;p跨過行a[0][]指向了行a[1][]

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

?

指針數(shù)組
例如:?int *p[n];
根據(jù)優(yōu)先級(jí),p先與[ ]結(jié)合所以p是一個(gè)數(shù)組,再結(jié)合 *,表明數(shù)組里面的元素是指針,再加上int,說明p數(shù)組中的元素是int類型的指針。

將二維數(shù)組賦給指針數(shù)組:

int *p[3]; int a[3][4]; p++;? //該語句表示p數(shù)組指向下一個(gè)數(shù)組元素。for(i=0;i<3;i++)p[i]=a[i] 這里int *p[3] 表示一個(gè)一維數(shù)組內(nèi)存放著三個(gè)指針變量,分別是p[0]、p[1]、p[2]所以要分別賦值。

在二維數(shù)組里面
a,&a,a[0],&a[0],&a[0][0]五個(gè)值是一樣的,都指向二維數(shù)組的首地址(起始位置)。區(qū)別在于這五種表達(dá)方式的類型是不同的,以int a[2][3]舉例:
a是二維數(shù)組名,是常量,存放著二維數(shù)組的首地址,類型為二維數(shù)組,sizeof(a)=24。
&a 二維數(shù)組a的(首)地址,本身是一個(gè)指針,sizeof(&a)=4,指針類型都為4。
a[0]指向二維數(shù)組中的第一行數(shù)組a[0][],類型是一維數(shù)組sizeof(a[0])=12。
&a[0]代表a[0]的地址,與一維數(shù)組名a[0]值相同,但本身是指針類型sizeof(&a[0])=4。
&a[0][0]表示二維數(shù)組中第一個(gè)元素的地址,指針類型sizeof(&a[0][0])=4。

?

A和&A之間的區(qū)別

分析如下代碼:

int main() {char a[5]={'A','B','C','D'};char (*p3)[5] = &a;char (*p4)[5] = a;return 0; }

上面對(duì)p3 和p4 的使用,哪個(gè)正確呢?p3+1 的值會(huì)是什么?p4+1 的值又會(huì)是什么?毫無疑問,p3 和p4 都是數(shù)組指針,指向的是整個(gè)數(shù)組。&a 是整個(gè)數(shù)組的首地址,a是數(shù)組首元素的首地址,其值相同但意義不同。在C/C++里,賦值符號(hào)“=”號(hào)兩邊的數(shù)據(jù)類型必須是相同的,如果不同需要顯示或隱式的類型轉(zhuǎn)換。p3 這個(gè)定義的“=”號(hào)兩邊的數(shù)據(jù)類型完全一致,而p4 這個(gè)定義的“=”號(hào)兩邊的數(shù)據(jù)類型就不一致了。左邊的類型是指向整個(gè)數(shù)組的指針,右邊的數(shù)據(jù)類型是指向單個(gè)字符的指針。在Visual C++6.0 上給出如下警告:

warning C4047: 'initializing' : 'char (*)[5]' differs in levels of indirection from 'char *'。

這里給出了警告,可是由于&a 和a 的值一樣,而變量作為右值時(shí)編譯器只是取變量的值,所以運(yùn)行并沒有什么問題。雖然能運(yùn)行,但不能這么用。

現(xiàn)在清楚了p3 和p4 都是指向整個(gè)數(shù)組的,那p3+1和p4+1的值就很好理解了。測(cè)試代碼如下:

#include <iostream> #include <cstdio> using namespace std;int main() {char a[5]={'a','b','c','d'};char (*p1)[5]= &a;char (*p2)[5]=(char (*)[5])a;printf("a = %p\n",&a); //%p打印數(shù)組地址printf("a = %c\n",a[0]);printf("p1 = %c\n",**p1);printf("p2 = %p\n",*p2);printf("p1+1 = %p\n",*(p1+1)); //p1是數(shù)組指針,數(shù)組a的長(zhǎng)度是5個(gè)字節(jié),所以p1+1將指向a[0]向后移動(dòng)5個(gè)字節(jié)的位置printf("p2+1 = %p\n",*(p2+1)); return 0; }



結(jié)論:根據(jù)指針類型及所指對(duì)象,表示指針大小,每次加1,表示增加指針類型大小的字節(jié)

?

另一個(gè)實(shí)例

#include <iostream> #include <cstdio> using namespace std;int main() {int a[4]={1,2,3,4};int *ptr1=(int *)(&a+1); //指向a數(shù)組后面的內(nèi)存單元,&a+1表示向后移16個(gè)存儲(chǔ)單元int *ptr2=(int *)(a+1); //表示a的存儲(chǔ)單元的地址增加一個(gè)字節(jié)printf("%d,%d",ptr1[-1],*ptr2); //ptr1[-1]其實(shí)指向的是a數(shù)組的最后一個(gè)單元return 0; }

其內(nèi)存布局如下圖:

參考:https://www.cnblogs.com/mq0036/p/3382732.html

總結(jié)

以上是生活随笔為你收集整理的C/C++数组指针和指针数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。