https://blog.csdn.net/constantin_/article/details/79575638
我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、甘德ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的甘德網(wǎng)站制作公司
就上面的博客作一下筆記:
關(guān)于【int (*p)[3]】與【int *p[3]】兩個的區(qū)別
https://blog.csdn.net/sayesan/article/details/39001609
https://blog.csdn.net/ywb201314/article/details/52062059
技巧1:注意*與[與變量結(jié)合的優(yōu)先順序,p有可能是指針,也有可能是數(shù)組,也有可能是函數(shù)名。
技巧2:關(guān)于“指針類型”的判定:
????????????1)首先,要確保變量就是一個指針類型。
????????? ? 2)去掉變量名,剩下的就是指針類型。
技巧3:關(guān)于“指針所指向的類型”的判定:
????????????1)首先,要確保變量就是一個指針類型。
????????? ? 2)去掉變量名指針的聲明符*,剩下的就是指針指向的類型。
void如果來修飾指針運算符*,就代表是任意類型的指針。
int (*p)[3];
關(guān)于復(fù)雜指針類型,上面這個類型。注意(*p)這個括號,僅僅是用來約束運算符優(yōu)先級的。不要和下面的指針類型混淆。
Int (*p)(int);
上面這個類型。注意(*p)這個括號,代表p指向的是一個函數(shù)。
所以在判斷(*p)指針的指向的內(nèi)容類型時,可以將(*p)同時去掉再行判斷 。
指針打印:采用%p
1)對于“例二”
? ? ?如果ptr指針類型聲明為char *,ptr++之后的打印結(jié)果為b。
????#include?"stdafx.h"???? ????#include?<stdlib.h>? ???? ????int?_tmain(int?argc,?_TCHAR*?argv[]) ????{ ???? char?a[20]={'a','b','c','d','e','f'};?? ????????char?*ptr=?a;?//強制類型轉(zhuǎn)換并不會改變a?的類型?? ????????ptr++;? ???? ???? printf("%c",*ptr); ???? system("pause"); ???? return?0; ????}
? ? ?如果ptr指針類型聲明為int *,ptr++之后的打印結(jié)果為e。?
????#include?"stdafx.h" ????#include?<stdlib.h>? ???? ????int?_tmain(int?argc,?_TCHAR*?argv[]) ????{ ???? char?a[20]={'a','b','c','d','e','f'};?? ????????int?*ptr=(int?*)a;?//強制類型轉(zhuǎn)換并不會改變a?的類型?? ????????ptr++;? ???? ???? printf("%c",*ptr); ???? system("pause"); ???? return?0; ????}
? ? ? 所以當(dāng)指針聲明成不同的類型,++的效果是不一樣的。++和指針的類型有關(guān)。
? ? ? 如果指針類型和指針所指向的類型不一致時,要注意++的使用。
?????
?2)對于“例三”
????#include?"stdafx.h"???? ????#include?<stdlib.h>? ???? ????int?_tmain(int?argc,?_TCHAR*?argv[]) ????{ ???? ?int?array[20]={0};?? ????????int?*ptr=array;?? ???? ???? ????????for(int?i=0;i<20;i++)?? ????????{?? ????????????(*ptr)++;?? ????????????ptr++; ????????}?? ???? ???? ?for(int?i=0;i<20;i++)?? ????????{?? ??????????printf("[%d]?=?%d\n",i,array[i]); ????????}? ???? ???? ???? system("pause"); ???? return?0; ????}
3)對于“例四”
#include?"stdafx.h" #include?<stdlib.h>? int?_tmain(int?argc,?_TCHAR*?argv[]) { char?a[20]="You_are_a_girl";?? int?*ptr=(int?*)a;?? ptr+=1; ????printf("%d\n",*ptr);? system("pause"); return?0; }
?對行%d,*ptr輸出的是1600483937
?對行%c,*ptr輸出的是a
?這是為什么,請高手解答?
4)對于“例五”
????#include?"stdafx.h"???? ????#include?<stdlib.h>? ???? ????int?_tmain(int?argc,?_TCHAR*?argv[]) ????{ ???? ????char?a[20]="You_are_a_girl";?? ????????????char?*p=a;?? ????????????char?**ptr=&p;?? ????????????//printf("p=%d\n",p);?? ????????????//printf("ptr=%d\n",ptr);?? ????????????//printf("*ptr=%d\n",*ptr);?? ????????????printf("**ptr=%c\n",**ptr);?? ????????????ptr++;?? ????????????//printf("ptr=%d\n",ptr);?? ????????????//printf("*ptr=%d\n",*ptr);?? ????????????printf("**ptr=%c\n",**ptr);? ???? system("pause"); ???? return?0; ????}
? ? ? ?這個例子有點繞,需要注意,上面我來配個圖
????????
? ? ? ?**ptr:分解開就是*(*ptr)
????????????????*ptr取指ptr所指向的內(nèi)容,ptr指向的地址是指針變量p所占用的內(nèi)存地址,ptr所指向的內(nèi)容就是指針p變量。
????????????????*(*ptr) 就是*p,也就是取p所指向的a的首地址的值,所以第一次打印ptr的值是Y。
????????????? ??
????????????????ptr++,就是得明白指針的++與普通的運算符是不一樣的(指針變量的++,代表它所指向的個體的內(nèi)存地址的遞增,且增長單位為指針類型所占字節(jié)個數(shù))。
????????????????ptr++,也就是?ptr所指向的地址+4(注意是p的地址+4,并非a的地址+4).
? ? ? ? ? ? ? ? ptr++ ,? 就是ptr所指向的內(nèi)存地址是指針p的內(nèi)存地址加4個字節(jié)的地址,至于這個地址里存儲的對象是啥,誰也不知道。
????????????????*ptr,ptr新指向內(nèi)存地址就是下面的這個藍牙框。 *(*ptr),就是把*ptr當(dāng)作是一個指針,而*ptr并非一定是一個指針。這樣程序可能就會報錯。
????????
?
5)對于“例9”
????? 假如我像下面這么寫,會報一個錯誤:
????#include?"stdafx.h"???? ????#include?<stdlib.h>? ???? ????int?_tmain(int?argc,?_TCHAR*?argv[]) ????{ ????int?array[10]={0,1,2,3,4,5,6,7,8,9},value;?? ????array++; ????value=*array;? ???? ????????printf("%d\n",value);? ???? system("pause"); ???? return?0; ????}
? ? ?error C2105: “++”需要左值
? ? 上面的錯誤百度了一個解釋:https://blog.csdn.net/hou09tian/article/details/75332576
????就是數(shù)組名是一個指針,但是不是一個變量。不可能對它進行++運算。++不可使用在常量上
? ? ?改一下代碼:
????int?_tmain(int?argc,?_TCHAR*?argv[])???? ????{ ????int?array[10]={0,1,2,3,4,5,6,7,8,9},value;?? ????int?*ptr?=?array; ????ptr++; ????value=*ptr;? ???? ????????printf("%d\n",value);? ???? system("pause"); ???? return?0; ????}
? ? ?結(jié)果輸出1
????
????其實,說到數(shù)組,我還一個 需要補充的:數(shù)組元素的內(nèi)存地址是連續(xù)的
????通過下面的代碼打?。?/p>
?for(int?i?=?0;?i?<?10;?i++){ ????printf("array[%d]?address?=?%d\n",i,&array[i]);? ?}
? ??
????
6)對于“例十”
???? strcpy函數(shù),會將char *指針所指向的字符串復(fù)制,而不僅僅是一個字符。
???? printf("%s",array);? ??%s是從起始位置輸出字符直到遇到\0為止,所以%s輸出char[]數(shù)組,會輸出整個串。
? ? ?
???? 關(guān)于strcpy函數(shù)的詳解:
?????https://blog.csdn.net/okawari_richi/article/details/57411796
7)對于“例十一”? (數(shù)組和指針)
???? sizeof 函數(shù):https://blog.csdn.net/u012520854/article/details/53511154
?????http://blog.sina.com.cn/s/blog_4badbe8e0100qb0s.html?(詳細說明數(shù)組名與指針的關(guān)系)
8)對于“例十二”? (結(jié)構(gòu)體和指針)
? ? ?https://www.cnblogs.com/winifred-tang94/p/5843440.html
???? 成員調(diào)用的方法(->左邊必須是指針,"."左邊必須是實體)
? ?特別注意結(jié)構(gòu)體與數(shù)組,和指針的關(guān)系是不一樣的。
????????
? ? ?
? ? ?對于*(ptr +1)打印的不是結(jié)構(gòu)體的第2個元素,很奇怪。難道數(shù)組名與結(jié)構(gòu)體名不一樣?
?????????printf("%s\n","----------結(jié)構(gòu)體名取結(jié)構(gòu)體正常數(shù)據(jù)------------------");? ??????printf("%d\n",*ss);? ??????printf("%d\n",*(ss+1));
? ? ??
????? 增加上述代碼,工程一編譯就報錯:
??????
????????????????錯誤1error C2100: 非法的間接尋址
????????????????錯誤2error C2676: 二進制“+”: “wmain::MyStruct”不定義該運算符或到預(yù)定義運算符可接收的類型的轉(zhuǎn)換
??????
????? ?所以我得出一個結(jié)論,數(shù)組名與結(jié)構(gòu)體名有完全不一樣的特性:結(jié)構(gòu)體名不能當(dāng)成指針使用,結(jié)構(gòu)體名不是指針常量。
????????
????????注意這行代碼:
????struct?MyStruct?*ptr=&ss;
????????假如ss是數(shù)組,上面的代碼就不用加&號了。
????struct?MyStruct?*ptr=ss;
????????但是結(jié)構(gòu)體會報錯:
????????????????錯誤1error C2440: “初始化”: 無法從“wmain::MyStruct”轉(zhuǎn)換為“wmain::MyStruct *”
????????這就更加證明了結(jié)構(gòu)體名不是指針常量這個結(jié)論 。
????????
????? ?繼續(xù)修改代碼:
????? ??
????????
????????
????????注意上面的打印結(jié)果,通過pstr取的結(jié)構(gòu)體元素地址是正確的,但是ptr取的結(jié)構(gòu)體元素地址是錯誤的。
? ? ? ? 注意代碼中ptr與pstr的定義:
????????
??????struct?MyStruct?*ptr=&ss;?? ??????int?*pstr=(int*)&ss;
? ? ? ? ptr指向的類型是 MyStruct,指向的對象為結(jié)構(gòu)體實體ss。
????????pstr指向的類型是int,指向的對象為結(jié)構(gòu)體的實體ss的首元素。
????????ptr+1,就是&ss這個地址+sizeof(MyStruct),就是&ss+16。
????????pstr+1,就是&ss這個地址+sizeof(int),就是&ss+4。
????????
????? --------------------------------------------------------------------------------------------? ?
? ? ? |? ?結(jié)構(gòu)體與數(shù)組的共性:
? ? ? |? ? ? ? 1)結(jié)構(gòu)體實體的地址和結(jié)構(gòu)體第一個元素的地址一樣,?各元素的地址也是連續(xù)的。(特殊情況也有不連續(xù)的)
????? |? ? ? ? ? ? ?數(shù)組實體的地址和數(shù)組第一個元素的地址一樣,?各元素的地址也是連續(xù)的。
????? |? ????? 2)數(shù)組和結(jié)構(gòu)體自身的實體(變量)并不占據(jù)獨立的內(nèi)存(和首元素地址一樣),只有元素才占用真正的內(nèi)存地址,
????? |? ????????? ?它只是標明自身的元素是一組特殊的數(shù)據(jù)結(jié)構(gòu), 通過實體封裝,便于元素的訪問。
????? ?|? ?
? ? ? |? 結(jié)構(gòu)體與數(shù)組的區(qū)別:
??????|?????? 1)數(shù)組名是指針常量,但是結(jié)構(gòu)體名和指針沒有任何的關(guān)系。
?????--------------------------------------------------------------------------------------------? ????
????????
9)對于“例十三”????????
? ? ? ?注意作者對結(jié)構(gòu)體的特殊之處的解釋
????????
10)指針類型的轉(zhuǎn)換
????? ?可以把指針的值當(dāng)作一個整數(shù)取出來,也可以把一個整數(shù)值當(dāng)作地址賦給一個指針
????? ??
11) 指針安全問題
????? ?這個很重要
? ? ? 使用指針必須要清楚指針指向了哪里
? ? ?
?????
?
網(wǎng)頁名稱:C語言指針
網(wǎng)頁路徑:http://sd-ha.com/article30/ggehso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、品牌網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)、軟件開發(fā)、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)