摘要:函數(shù)的返回值為指針就按照字面意思,指針函數(shù)的定義顧名思義,指針函數(shù)即返回指針的函數(shù)。
本次博客內(nèi)容為指針進(jìn)階,在上次指針基礎(chǔ)的內(nèi)容上做了延申
有需求的可以再去看一看上一篇的指針基礎(chǔ)
https://blog.csdn.net/qq_59708493/article/details/120606282
本篇內(nèi)容建議收藏后反復(fù)食用;
前面學(xué)習(xí)函數(shù)學(xué)到,函數(shù)參數(shù)可以為 int、char、float 等,所有操作都只在函數(shù)體內(nèi)有效(除對指針的操作外),那么我們來學(xué)習(xí)一下指針作為函數(shù)參數(shù)。
就按照字面意思,
1.指針函數(shù)的定義
顧名思義,指針函數(shù)即返回指針的函數(shù)。其一般定義形式如下:
類型名 *函數(shù)名(函數(shù)參數(shù)表列);
其中,后綴運(yùn)算符括號“()”表示這是一個(gè)函數(shù),其前綴運(yùn)算符星號“*”表示此函數(shù)為指針型函數(shù),其函數(shù)值為指針,即它帶回來的值的類型為指針,當(dāng)調(diào)用這個(gè)函數(shù)后,將得到一個(gè)“指向返回值為…的指針(地址),“類型名”表示函數(shù)返回的指針指向的類型”。
int s;void mian(){ int *r = sum(10, 9); printf("10 + 9 + %d", *r);}int *sum(int x, int y){ s = x + y; return &s;}
#include int f(int *p);int main(void){ int i=6; printf("&i=%p/n",&i); f(&i); return 0; } int f(int *p) { printf(" p=%p/n",p); }
輸出的結(jié)果是一樣的
&i=000000000062FE1C p=000000000062FE1C
我們利用上一篇文章中的指針基礎(chǔ)再來分析一下這一串代碼
#include int main(void){ int i=6; int*p=&i; printf("%p/n",p); printf("%p/n",&i); printf("%d/n",*p); return 0;}
這串代碼的結(jié)果
000000000062FE14000000000062FE146--------------------------------Process exited after 0.03068 seconds with return value 0請按任意鍵繼續(xù). . .
代碼中我們定義int*p=&i
p時(shí)指針變量,是一個(gè)=&i的地址,或者說p是變量i的指針
再來看一個(gè)經(jīng)典的例子
利用函數(shù)交換變量a,b的值
#include int swap(int*x,int *y);int main(){ int a=7,b=8; swap(&a,&b); printf("a=%d,b=%d",a,b); return 0;}int swap(int*x,int *y){ int t; t=*x; *x=*y; *y=t; return 0;}
運(yùn)行結(jié)果為
a=8,b=7--------------------------------Process exited after 0.0297 seconds with return value 0請按任意鍵繼續(xù). . .
注:當(dāng)函數(shù)參數(shù)為指針時(shí),當(dāng)我i們調(diào)用這個(gè)函數(shù)時(shí)應(yīng)該給他一個(gè)變量的地址;而不是變量本身;具體為什么,參考上述代碼
#include int f(int *p);int f(int k);int main(){ int a=9; printf("%p/n",&a); f(&a); f(a); return 0; } int f(int *p) { printf("p1=%p/n",p); *p=11; printf("p2=%p/n",p); return 0; } int f(int k){ printf("k=%d/n",k); return 0;}
可以在你的編譯器上運(yùn)行一下這個(gè)程序
000000000062FE1Cp1=000000000062FE1Cp2=000000000062FE1Ck=11--------------------------------Process exited after 0.02982 seconds with return value 0請按任意鍵繼續(xù). . .
有沒有很神奇
所以說通過參數(shù)為指針的函數(shù)可以改變一個(gè)變量的值
數(shù)組變量本身表達(dá)地址(但是數(shù)組單元表達(dá)的是變量,)
[ ]運(yùn)算符可以對數(shù)組做,也可以對指針做;
例如
#include int main(){ int a[]={1,2,5,9,63,8,7,3,9,3,8,63,9,5,596,9}; int*p=a; printf("%d/n",p[3]); printf("%d/n",a[3]); return 0; }
運(yùn)行結(jié)果p[3]和a[3]的相同;
99--------------------------------Process exited after 0.03134 seconds with return value 0請按任意鍵繼續(xù). . .
同樣的,*運(yùn)算符也可以對數(shù)組使用
#include int main(){ int a[]={1000,2,5,9,63,8,7,3,9,3,8,63,9,5,596,9}; int*p=a; printf("%d/n",p[3]); printf("%d/n",*a); return 0; }
運(yùn)行結(jié)果
91000--------------------------------Process exited after 0.03093 seconds with return value 0請按任意鍵繼續(xù). . .
數(shù)組變量是const的指針,所以不能被賦值
如果定義指針時(shí)int* const p
意思是說指針變量p不可以修改
例如
#include int main(){ int i=33; int *const p=&i; printf("%d/n",*p); i=22; printf("%d/n",*p); }
是可以運(yùn)行的
而`
#include int main(){ int i=33; int *const p=&i; printf("%d/n",*p); i=22; printf("%d/n",*p); p++; printf("%d",*p); }
是無法運(yùn)行的
9 3 E:/PTA/未命名1.cpp [Error] increment of read-only variable "p"
所指是const有兩種類型
1.const int *p
2.int const p
他們表達(dá)的意思相同
都是指p不可改變
所以將上面代碼的int const p改為int constp
代碼便可以運(yùn)行
#include int main(){ int i=33; int const * p=&i; printf("%d/n",*p); i=22; printf("%d/n",*p); p++; printf("%d",*p); }
33226487576--------------------------------Process exited after 0.03231 seconds with return value 0請按任意鍵繼續(xù). . .
上一篇指針基礎(chǔ)已經(jīng)講過大部分指針運(yùn)算內(nèi)容
我們再來補(bǔ)充一點(diǎn)東西
p++
取出p所致=指的那個(gè)數(shù)據(jù)來,后將p移到下一個(gè)位置
++的優(yōu)先級高于
我們可以利用*p++完成一些事情
#include int main(){ int a[]={4,8,8,5,8,52,9,52,8,8,5,8,5,8,0}; int *p=a; while(*p!=0) { printf("%d ",*p); *p++; } printf("/n"); for(p=a;*p!=0;*p++) printf("%d ",*p); }
我們可以用while和for循環(huán)實(shí)現(xiàn)數(shù)組的遍歷;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/121851.html
摘要:自己實(shí)現(xiàn)時(shí)返回值可根據(jù)實(shí)際情況而定源字符串必須以結(jié)束。語言中給了一些長度受限的字符串函數(shù),而前面的函數(shù)是長度不受限的字符串函數(shù)。拷貝個(gè)字符從源字符串到目標(biāo)空間。 目錄 字符函數(shù)和字符串函數(shù) 函數(shù)介紹 strlen strcpy strcat strcmp strncpy ?strncat s...
摘要:如果我們要將的地址保存到中,我們需要我們給指針變量相應(yīng)的類型。類型的指針是為了存放類型變量的地址這里可以看到,指針的定義方式是類型名指針變量名。如下最后本文介紹的是指針的基礎(chǔ)知識,往后還會繼續(xù)深入講解指 ...
摘要:一結(jié)構(gòu)體的聲明與定義結(jié)構(gòu)體的聲明結(jié)構(gòu)是一些值的集合,這些值稱為成員變量。但是結(jié)構(gòu)體變量的變量名并不是指向該結(jié)構(gòu)體的地址,所以要使用取地址運(yùn)算符才能獲取其地址。因此,結(jié)構(gòu)體傳參的時(shí)候,要傳結(jié)構(gòu)體的地址。 ...
摘要:本章節(jié)在此基礎(chǔ)上,對語言階段指針進(jìn)行更深層次的研究。數(shù)組指針的類型由數(shù)組類型決定,先找出數(shù)組的類型去掉名就是類型。相當(dāng)于數(shù)組指針?biāo)赶驍?shù)組的數(shù)組名。數(shù)組指針指向整個(gè)數(shù)組,將其看作二維數(shù)組并解引用得到一行的首元素,從而遍歷訪問。 ...
閱讀 3319·2021-11-08 13:12
閱讀 2756·2021-10-15 09:41
閱讀 1451·2021-10-08 10:05
閱讀 3300·2021-10-08 10:04
閱讀 2102·2021-09-29 09:34
閱讀 2471·2019-08-30 15:55
閱讀 2979·2019-08-30 15:45
閱讀 2576·2019-08-29 14:17