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