日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言二级指针与典型应用(1)

發(fā)布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言二级指针与典型应用(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二級指針的定義:

A(即B的地址)是指向指針的指針,稱為二級指針,用于存放二級指針的變量稱為二級指針變量.本質:二級指針變量的值是一個地址。

一、概念

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


首先,默認的編譯器是32位,即int型為4字節(jié)。

C:"一段內容",可是是一個具體的常量、變量、或是用malloc(new)分配了一塊內存。C的起始地址是0x00000008。

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

備注:當C是一個局部 非static變量或是數(shù)組時,系統(tǒng)是在棧中為變量分配內存;如果是采用malloc,則是在堆中分配內存。當B是一個局部 非static指針變量時,系統(tǒng)是在棧中為變量分配內存,即B的起始地址是在棧中;但并不限制指針所指向對象的內存位置,即可以指向在堆中的變量,如malloc分配的數(shù)組變量。

[cpp]?view plain?copy
  • B=?0x00000008;??//B的值???
  • *B?=?"一段內容";??//B取內容,也就是B指針指向的C的值??
  • &B?=?0x00000004;??//B取地址,B的地址是0x00000004??
  • A是二級指針變量,其中存放著B的地址0x00000004。A也有地址,是0x00000000;

    [cpp]?view plain?copy
  • *A?=?B=?0x00000008;??//A取內容就是B的內容???
  • **A?=?*B?=?"一段內容";??//B取內容,也就是B指針指向的C的值??
  • A?=?&B?=?0x00000004;??//A存的是B的地址,B的地址是0x00000004??
  • &A?=?0x00000000;??//A取地址??

  • 二、典型使用之一

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

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

    1.先看看一級指針的實現(xiàn)

    #include <stdio.h> #include <stdlib.h>int a= 10; int b = 100; int *q = NULL;void func(int *p) {printf("func:&p=%d,p=%d\n",&p,p); //note:3p = &b;printf("func:&p=%d,p=%d\n",&p,p); //note:4 }int main() {printf("&a=%d,&b=%d,&q=%d\n",&a,&b,&q); //note:1q = &a;printf("*q=%d,q=%d,&q=%d\n",*q,q,&q); //note:2func(q);printf("*q=%d,q=%d,&q=%d\n",*q,q,&q); //note:5return 0; }


    輸出:

    note:1->a,b,q都有一個地址.

    note:2->q指向a.

    note:3->我們發(fā)現(xiàn)參數(shù)p的地址和q的地址并不相同。

    note:4->p重新指向b.

    note:5->退出函數(shù),p的修改并不會對q造成影響。

    結論:

    (1)p的地址和q的地址不同的原因形參p在函數(shù)func被調用時作為臨時變量,系統(tǒng)會在棧中為p分配一個獨立內存,而q作為全局變量,是在靜態(tài)內存區(qū)分配的內存(參見文檔:《C/C++程序運行時的內存分配》);因此p和q具有不同的地址。但是同時注意:p和q的地址不同,但是值(即保存的數(shù)據)相同,均是變量a的地址。

    (2)C語言中,實參向形參的數(shù)據傳遞分為3種:值傳遞、地址傳遞和引用傳遞。此處屬于地址傳遞(即實參和形參的均是某變量的地址)。因此,p和q均指向a,對*p進行操作,即對a進行操作。但是注意不管對p進行何種操作,均不會改變q的值和q的地址(因為屬于不同的變量),最多只會改變q指向的變量a的值。

    (3)如果想通過操作指針p,對a和q均進行修改,那就需要用到二級指針。

    2.二級指針操作

    #include <stdio.h> #include <stdlib.h>int a= 10; int b = 100; int *q = NULL;void func(int **p) {printf("func:\tp=%d\t&p=%d\n",p,&p); //note:3*p = &b;printf("func:\tp=%d\t&p=%d\n",p,&p); //note:4 }int main() {printf("&a=%d\t&b=%d\t&q=%d\n",&a,&b,&q); //note:1q = &a;printf("*q=%d\tq=%d\t&q=%d\n",*q,q,&q); //note:2func(q);printf("*q=%d\tq=%d\t&q=%d\n",*q,q,&q); //note:5return 0; }

    結論::

    (1)p為二級指針,保存的是q的地址。參見上:p和q保存在不同的內存區(qū)域。p=&q,因此當進行*p=&b時,即進行的是q=&b,改變了指針q的指向。

    例子:?

    void my_malloc(char **s) { *s=(char*)malloc(100); } void main() { char *p=NULL; my_malloc(&p); free(p);p=NULL; }

    函數(shù)分析

    (1)目的:通過調用子函數(shù),為主函數(shù)指針分配一塊內存空間;

    在調用my_malloc時,實參值為&p,即指針p的地址;my_malloc執(zhí)行時,分配臨時變量s=&p;?*s=(char*)malloc(100)操作等同于:p=(char*)malloc(100);即通過調用子函數(shù),為主函數(shù)指針分配一塊內存空間。

    (2)注意:如果malloc函數(shù)被調用,則后續(xù)函數(shù)中一定需要有free將對應的內存釋放,否則可能導致內存泄露;當free(p)后,需要讓p=NULL,否則指針p會成為野指針!

    文章部分參考:http://blog.csdn.net/majianfei1023/article/details/46629065


    總結

    以上是生活随笔為你收集整理的C语言二级指针与典型应用(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。