中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言二級指針的作用是什么

發布時間:2021-07-13 14:29:57 來源:億速云 閱讀:855 作者:chen 欄目:互聯網科技

這篇文章主要介紹“C語言二級指針的作用是什么”,在日常操作中,相信很多人在C語言二級指針的作用是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言二級指針的作用是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、概念

在如下的A指向B、B指向C的指向關系中:

首先

C是"一段內容",比如你用malloc或者new分配了一塊內存,然后塞進去"一段內容",那就是C了。C的起始地址是0x00000008。

B是一個指針變量,其中存放著C的地址,但是B也要占空間的啊,所以B也有地址,B的起始地址是0x00000004,但是B內存中存放的是C的地址,所以B里面的內容就是0x00000008。

那么到此為止都比較好理解:
 

 
  1.  

    B= 0x00000008; //B的內容  

  2.  

    *B = "一段內容"; //B解引用,也就是B指針指向的C的值  

  3.  

    &B = 0x00000004; //B取地址,B的地址是0x00000004  

那么,再來看A:

A是二級指針變量,其中存放著B的地址0x00000004,A也有地址,是0x00000000;

 
  1.  

    *A = B= 0x00000008; //A解引用也就是B的內容  

  2.  

    **A = *B = "一段內容"; //B解引用,也就是B指針指向的C的值  

  3.  

    A = &B = 0x00000004; //A存的是B的地址,B的地址是0x00000004  

  4.  

    &A = 0x00000000; //A取地址  

C語言二級指針的作用是什么

指向指針的指針即二級指針保存的是一級指針的地址,比如:

         p是一級指針,保存的是a的地址;q是指向指針的指針(二級指針),保存的是一級指針(p)的地址;q的內容就是0xbfaca770,*q的值即q指向的內容0xbfaca776,即*q仍然是一個地址,也就是指針p的內容,即*q=p
 

二、使用

二級指針作為函數參數的作用:在函數外部定義一個指針p,在函數內給指針賦值,函數結束后對指針p生效,那么我們就需要二級指針。

看看下面一段代碼:有兩個變量a,b,指針q,q指向a,我們想讓q指向b,在函數里面實現。

1.先看看一級指針的實現

#include<iostream>
using namespace std;
int a= 10;
int b = 100;
int *q;
void func(int *p)
{
cout<<"func:&p="<<&p<<",p="<<p<<endl; //note:3
p = &b;
cout<<"func:&p="<<&p<<",p="<<p<<endl; //note:4
}
int main()
{
cout<<"&a="<<&a<<",&b="<<&b<<",&q="<<&q<<endl; //note:1
q = &a;
cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl; //note:2
func(q);
cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl; //note:5
system("pause");
return 0;
}
這么寫有什么問題?為什么*q不等于100?我們看一下輸出便知:
&a=0032F000,&b=0032F004,&q=0032F228
*q=10,q=0032F000,&q=0032F228
func:&p=0018FD24,p=0032F000
func:&p=0018FD24,p=0032F004
*q=10,q=0032F000,&q=0032F228
我們看輸出:
note:1->a,b,q都有一個地址.
note:2->q指向a.
note:3->我們發現參數p的地址變了,跟q不一樣了,是的參數傳遞是制作了一個副本,也就是p和q不是同一個指針,但是指向的地址0x0032F000(a的地址)還是不變的.
note:4->p重新指向b.
note:5->退出函數,p的修改并不會對q造成影響。
結論:
編譯器總是要為函數的每個參數制作臨時副本,指針參數p的副本是 p,編譯器使 p = q(但是&p != &q,也就是他們并不在同一塊內存地址,只是他們的內容一樣,都是a的地址)。如果函數體內的程序修改了p的內容(比如在這里它指向b)。在本例中,p申請了新的內存,只是把 p所指的內存地址改變了(變成了b的地址,但是q指向的內存地址沒有影響),所以在這里并不影響函數外的指針q。
這就需要二級指針操作:
2.二級指針操作
#include<iostream>
using namespace std;
int a= 10;
int b = 100;
int *q;
void func(int **p) //2
{
cout<<"func:&p="<<&p<<",p="<<p<<endl;
*p = &b; //3
cout<<"func:&p="<<&p<<",p="<<p<<endl;
}
int main()
{
cout<<"&a="<<&a<<",&b="<<&b<<",&q="<<&q<<endl;
q = &a;
cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl;
func(&q); //1
cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl;
system("pause");
return 0;
}
這里只改了三個地方,變成傳二級指針。我們再看:
因為傳了指針q的地址(二級指針**p)到函數,所以二級指針拷貝(拷貝的是p,一級指針中拷貝的是q所以才有問題),(拷貝了指針但是指針內容也就是指針所指向的地址是不變的)所以它還是指向一級指針q(*p = q)。在這里無論拷貝多少次,它依然指向q,那么*p = &b;自然的就是 q = &b;了。
3.再看一個例子:
我們代碼中以二級指針作為參數比較常見的是,定義了一個指針MyClass *ptr=NULL,在函數內對指針賦值*ptr=malloc(...),函數結束后指針依然有效.這個時候就必須要用二級指針作為參數func(MyClass **p,...),一級指針為什么不行上面說了。
void my_malloc(char **s)
{
*s=(char*)malloc(100);
}
void main()
{
char *p=NULL;
my_malloc(&p);
//do something
if(p)
free(p);
}
這里給指針p分配內存,do something,然后free(p),如果用一級指針,那么就相當于給一個p的拷貝s分配內存,p依然沒分配內存,用二級指針之后,才對p分配了內存。

到此,關于“C語言二級指針的作用是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂尔多斯市| 岑溪市| 河北省| 聊城市| 调兵山市| 天台县| 高平市| 五常市| 西丰县| 百色市| 集安市| 桃园县| 常熟市| 马鞍山市| 梅州市| 博客| 大洼县| 响水县| 宁阳县| 阳高县| 磐石市| 佛教| 贵德县| 祁阳县| 金寨县| 扎兰屯市| 安康市| 扎囊县| 周口市| 喀喇沁旗| 清水县| 民权县| 枣强县| 自治县| 湖北省| 霍城县| 德化县| 奉节县| 娱乐| 鸡东县| 台州市|