“指向指针的指针”的作用和应用
生活随笔
收集整理的這篇文章主要介紹了
“指向指针的指针”的作用和应用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
結(jié)合http://blog.csdn.net/oqqhutu12345678/article/details/60963087來看。
結(jié)合http://blog.csdn.net/oqqhutu12345678/article/details/68489807來看。
(1)在子函數(shù)中修改主函數(shù)傳過來的指針的指向
- 比如主函數(shù)申明一個(gè)指針變量,且不為其分配指向空間(只是指向NULL),然后取該指針變量的地址傳參給子函數(shù);
- 在子函數(shù)里根據(jù)需要申請(qǐng)一片空間;
- 對(duì)傳參解引用后得到原來的指針變量,且把該指針變量指向剛才申請(qǐng)的空間(修改了原來指針的指向,這是本質(zhì));
- 從而實(shí)現(xiàn)不確定返回值個(gè)數(shù)的編程方法(這是應(yīng)用);
例子1(本質(zhì)):
#include<stdio.h> int find(char *s, char src, char **rt)//從s中查詢出src字符所在的位置并在rt中返回。 {int i = 0;while (*(s + i)){if (*(s + i) == src)//只會(huì)出現(xiàn)一次滿足條件,此時(shí)將此地址給*rt,即p{* rt = s + i;//這里修改了p的指向}i++;}return 0;}int main(void) {char a[10] = "zhuyujia";char *p=NULL;find(a, 'y', &p);//改變p的指向,在子函數(shù)中實(shí)現(xiàn)printf("%s", p);getchar(); getchar();return 0; }/* //補(bǔ)充: 打印指針的時(shí)候,會(huì)把指針?biāo)赶虻膬?nèi)容以及至字符串末位的內(nèi)容都打印出來 #include<stdio.h> int main(void) {char a[10] = "abcdefgff";char* p = &a[6];printf("%s", p);//會(huì)打印gffgetchar(); getchar();return 0; } */
例子2:
#include <stdlib.h> #include <time.h> #include<stdio.h> /*當(dāng)然有必須使用二級(jí)指針才能解決的情況,如,某個(gè)函數(shù)的功能是 返回某個(gè)問題的計(jì)算結(jié)果,但是結(jié)果數(shù)據(jù)是不確定個(gè)數(shù)的值,所以 在調(diào)用此函數(shù)時(shí)不知道事先應(yīng)分配多少空間來保存返回的數(shù)據(jù),此時(shí) 的處理辦法就是傳遞一個(gè)沒有分配空間的指針的指針(地址)進(jìn)去, 讓函數(shù)自己根據(jù)計(jì)算的結(jié)果分配足夠的空間來保存結(jié)果,并返回, 調(diào)用者使用了結(jié)果后,由調(diào)用者負(fù)責(zé)內(nèi)存的釋放,即,大家可能聽說 過的"誰使用(調(diào)用)誰釋放"之類的話,如下面的代碼:*///返回不定結(jié)果個(gè)數(shù)的計(jì)算函數(shù) //參數(shù)int **pResult 保存返回?cái)?shù)據(jù)的指針的指針 //參數(shù)int &count 保存返回的結(jié)果個(gè)數(shù) void Compute2(int **pResult, int &count) {//使用隨機(jī)數(shù)來模擬計(jì)算結(jié)果數(shù)的個(gè)數(shù)srand(time(NULL));count = rand() % 10;//控制個(gè)數(shù)在10個(gè)以內(nèi)*pResult = new int[count];//*pResult相當(dāng)于主函數(shù)傳來的pResult指針,//這里就修改了主函數(shù)中的pResult指向,因?yàn)檫€是指針,因此可以指向新開辟的空間for (int i = 0; i < count; i++){(*pResult)[i] = rand();//給結(jié)果隨即賦值} }//返回不定結(jié)果個(gè)數(shù)的計(jì)算函數(shù)(此函數(shù)不能返回?cái)?shù)據(jù)) //參數(shù)int *pResult 為保存返回?cái)?shù)據(jù)的指針 //參數(shù)int &count 為保存返回的結(jié)果個(gè)數(shù) void Compute1(int *pResult, int &count) {//使用隨機(jī)數(shù)來模擬計(jì)算結(jié)果數(shù)的個(gè)數(shù)srand(time(NULL));count = rand() % 10;//控制個(gè)數(shù)在10個(gè)以內(nèi)pResult = new int[count];for (int i = 0; i < count; i++){pResult[i] = rand();//給結(jié)果隨即賦值} }int main(void) {int *pResult = NULL;//待獲取結(jié)果的指針,這里沒有分配空間大小,因?yàn)椴恢婪祷亟Y(jié)果的個(gè)數(shù)//具體返回的個(gè)數(shù)在在子函數(shù)中確定,此時(shí)指針pResult指向也改變了//這就間接的說明“在子函數(shù)中修改主函數(shù)傳來的指針”的意圖//具體的應(yīng)用就在于返回個(gè)數(shù)不確定的場(chǎng)景,這是后面編程的一個(gè)體會(huì)點(diǎn)int count = 0;//返回結(jié)果的個(gè)數(shù)/*Compute1(pResult,count);//pResult為指針,第二個(gè)參數(shù)使用引用傳遞,//使用這個(gè)函數(shù)時(shí),在函數(shù)內(nèi)部分配的內(nèi)存的指針并沒有返回到主函數(shù)中for ( int i = 0 ; i < count ; i++ )printf("第 %d 個(gè)結(jié)果為 : %d\n",pResult[i]);//執(zhí)行了Compute1()函數(shù)后,pResult的值還是為NULLdelete [] pResult;pResult = NULL;*/Compute2(&pResult, count); //&pResult為指針的地址(即指針的指針),第二個(gè)參數(shù)使用引用傳遞for (int i = 0; i < count; i++)printf("第 %d 個(gè)結(jié)果為 : %d\n", i, pResult[i]);delete[] pResult;pResult = NULL;getchar();return 0; }(2)用指針的指針取二維數(shù)組的元素
/* #include<stdio.h//錯(cuò)誤的做法 int change(char **p) {int i, j;for (i = 0; i < 5; i++){for (j = 0; *(*(p + i) + j) != '\0'; j++){printf("%c", *(*(p + i) + j));}printf("\n");}return 0; }//若希望賦值,則不能使用指針的指針,要使用數(shù)組進(jìn)行運(yùn)算。 int change(char p[][10]) {int i, j;for (i = 0; i < 5; i++){for (j = 0; p[i][j] != '\0'; j++){p[i][j] = 'c';printf("%c", p[i][j]);}printf("\n");}return 0; }int main(void) {char a[5][10] = { "hello", "zhuyu", "jiajia", "linux","Ubuntu" };change(a);return 0; }*/#include<stdio.h> int change(char **p) {int i, j;for (i = 0; i < 5; i++){for (j = 0; *(*(p + i) + j) != '\0'; j++)//利用指針的指針取二維數(shù)組的元素{*(*(p + i) + j) = 'c';printf("%c", *(*(p + i) + j));}printf("\n");}return 0; }int main(void) {char a[5][10] = { "hello", "zhuyu", "jiajia", "linux","Ubuntu" };char *b[5] = { a[0],a[1],a[2],a[3],a[4] };//這樣做讀取和寫入操作都是可以的。change(b);return 0; }(3)用指針的指針指向指針數(shù)組
#include<stdio.h> int change(char **p) {int i, j;for (i = 0; i < 5; i++){for (j = 0; *(*(p + i) + j) != '\0'; j++)//利用指針的指針取二維數(shù)組的元素{*(*(p + i) + j) = 'c';printf("%c", *(*(p + i) + j));}printf("\n");}return 0; }int main(void) {char *a[5] = { "hello", "zhuyu", "jiajia", "linux","Ubuntu" };//如果想使用 需使用指針數(shù)組即*a[5] 聲明一個(gè)有五個(gè)字符串指針的數(shù)組。//但是由于每個(gè)元素都是指針字符串,所以只能夠讀取,而不能夠?qū)懭搿hange(a);return 0; }總結(jié)
以上是生活随笔為你收集整理的“指向指针的指针”的作用和应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apizza-快如何进行API开发进度管
- 下一篇: 字符设备驱动基础篇2——用开发板来调试驱