C語(yǔ)言指針

在C語(yǔ)言中淮逊,每一個(gè)變量都有一個(gè)內(nèi)存位置,每一個(gè)內(nèi)存位置都定義了可使用連字號(hào)(&)運(yùn)算符訪問(wèn)的地址死遭,它表示了在內(nèi)存中的一個(gè)地址偿短。指針是C語(yǔ)言的重中之重及精華的地方欣孤,所以我盡量多些代碼來(lái)熟悉,看一個(gè)Demo:

#include<stdio.h>
int main()
{
    int var1 = 10;
    char var2[10];
    printf("address of var1 is %p \n",&var1);
    printf("address of var2 is %p \n",&var2);
    return 0;
}
result:
address of var1 is 00CFFD5C
address of var2 is 00CFFD48

什么是指針

指針是一個(gè)變量翔冀,其值為另一個(gè)變量的地址导街,即,內(nèi)存位置的直接地址纤子。就像其他變量或常量一樣搬瑰,您必須在使用指針存儲(chǔ)其他變量地址之前,對(duì)其進(jìn)行聲明控硼。指針變量聲明的一般形式為:

type *var_name
int *ip; //一個(gè)指向整型的指針
char *ch; //一個(gè)指向char類型的指針

所有實(shí)際數(shù)據(jù)類型泽论,不管是整型、浮點(diǎn)型卡乾、字符型翼悴,還是其他的數(shù)據(jù)類型,對(duì)應(yīng)指針的值的類型都是一樣的幔妨,都是一個(gè)代表內(nèi)存地址的長(zhǎng)的十六進(jìn)制數(shù)鹦赎。
不同數(shù)據(jù)類型的指針之間唯一的不同是,指針?biāo)赶虻淖兞炕虺A康臄?shù)據(jù)類型不同

如何使用指針

使用指針時(shí)會(huì)頻繁進(jìn)行以下幾個(gè)操作:定義一個(gè)指針變量误堡、把變量地址賦值給指針古话、訪問(wèn)指針變量中可用地址的值。這些是通過(guò)使用一元運(yùn)算符 * 來(lái)返回位于操作數(shù)所指定地址的變量的值锁施∨悴龋看demo:

#include<stdio.h>
int main()
{
    int var = 0;
    int \*pointer = &var; //得到變量var儲(chǔ)存的地址
    printf("address of var is %p\n",&var);
    printf("address of var is %p\n",pointer);
    printf("data is %d\n",*pointer);  //*運(yùn)算符為取出地址的內(nèi)容
    return 0;
}
result:
address of var is 00DBF95C
address of var is 00DBF95C
data is 0

指針數(shù)組和數(shù)組指針

看demo

#include <stdio.h>
const int MAX = 3;
int main ()
{
   int  var[] = {10, 100, 200};
   int i, \*ptr[MAX];  //指針數(shù)組
   for ( i = 0; i < MAX; i++)
   {
      ptr[i] = &var[i]; /* 賦值為整數(shù)的地址 */
   }
   for ( i = 0; i < MAX; i++)
   {
      printf("Value of var[%d] = %d\n", i, *ptr[i] );
   }
   return 0;
}

C語(yǔ)言沒(méi)有字符串,可用數(shù)組悉抵,Demo:

#include <stdio.h>
const int MAX = 4;
int main ()
{
   const char *names[] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
   };//聲明了一個(gè)字符串指針數(shù)組
   int i = 0;
   for ( i = 0; i < MAX; i++)
   {
      printf("Value of names[%d] = %s\n", i, names[i] );
   }
   return 0;
}

指向指針的指針

指向指針的指針是一種多級(jí)間接尋址的形式肩狂,或者說(shuō)是一個(gè)指針鏈。通常姥饰,一個(gè)指針包含一個(gè)變量的地址傻谁。當(dāng)我們定義一個(gè)指向指針的指針時(shí),第一個(gè)指針包含了第二個(gè)指針的地址列粪,第二個(gè)指針指向包含實(shí)際值的位置
pointer.PNG

int **ptr; //ptr指向一個(gè)指針栅螟,該指針指向一個(gè)int類型的數(shù)據(jù)

#include<stdio.h>
int main()
{
    int var = 100;
    int *ptr;
    int **pptr;
    ptr = &var;
    pptr = &ptr;
    printf("data of var is : %d\n",var);
    printf("data of prt is %p\n",ptr);
    printf("the data store in  prt is %d\n",*ptr);
    printf("data of pprt is %p\n",pptr);
    printf("the data store in  pprt is %p\n",*pptr);
    return 0;
}
result:
data of var is : 100
data of prt is 00D3FCC0
the data store in  prt is 100
data of pprt is 00D3FCB4
the data store in  pprt is 00D3FCC0
//可以看到,var的值為100篱竭,它存儲(chǔ)的位置是00D3FCC0
//ptr的值為00D3FCC0力图,它儲(chǔ)存的位置是00D3FCB4
//因此,可以通過(guò)pptr一步步鏈接找到vae的值
//指針的指針即是指向指針的指針

傳遞指針給函數(shù)

C 語(yǔ)言允許您傳遞指針給函數(shù)掺逼,只需要簡(jiǎn)單地聲明函數(shù)參數(shù)為指針類型即可吃媒。

#include<stdio.h>
void assignment(int *ptr); //接受一個(gè)指向int類型的數(shù)據(jù)的指針作為參數(shù)
int main()
{
    int var = 10;
    printf("before assignment: %d\n",var);
    assignment(&var);
    printf("after assignment: %d\n",var);
    return 0;
}
void assignment(int *ptr)
{
    *ptr = 20;
}
result:
before assignment: 10
after assignment: 20
//傳遞指針到函數(shù)是直接對(duì)地址進(jìn)行操作,所以可以修改值
//DEMO:傳遞數(shù)組給函數(shù)
\#include<stdio.h>
\#include<stdlib.h>
void increase(int *ptr,int size);
int main()
{
    int Arr[3] = {0};
    int i = 0;
    printf("before increase\n");
    for(i= 0 ;i < 3;i++ )
    {
        printf("%d  ",Arr[i]);
    }
    increase(Arr,3);
    printf("\nafter increase\n");
    for(i= 0 ;i < 3;i++ )
    {
        printf("%d  ",Arr[i]);
    }
    system("pause");
    return 0;
}
void increase(int *ptr,int size)
{
    int i;
    for(i = 0; i <size ; i++ )
    {
        *(ptr+i) =i;
    }
    return ;
}
result:
before increase
0  0  0
after increase
0  1  2

函數(shù)指針

函數(shù)指針是指向函數(shù)的指針變量。通常我們說(shuō)的指針變量是指向一個(gè)整型赘那、字符型或數(shù)組等變量刑桑,而函數(shù)指針是指向函數(shù)。函數(shù)指針可以像一般函數(shù)一樣募舟,用于調(diào)用函數(shù)祠斧、傳遞參數(shù)。
函數(shù)指針變量的聲明:

datatype (*ptr) (datatype,datatype)

#include<stdio.h>
#include<stdlib.h>
int max_n(int a ,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
int main()
{
    int (* ptr)(int,int) = max_n; //指向max函數(shù)
    int a , b;
    a = 2;
    b = 4;
    printf("%d  ",ptr(a,b));//直接調(diào)用函數(shù)
    return 0; }

***回調(diào)函數(shù)

函數(shù)指針作為某個(gè)函數(shù)的參數(shù):函數(shù)指針變量可以作為某個(gè)函數(shù)的參數(shù)來(lái)使用的拱礁,回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)琢锋。簡(jiǎn)單講:回調(diào)函數(shù)是由別人的函數(shù)執(zhí)行時(shí)調(diào)用你實(shí)現(xiàn)的函數(shù)。

#include<stdio.h>
#include<stdlib.h>
int getNumber(void)
{
    return rand();
}
int getNumber(int a)
{
    return rand();
}
void GetArr(int *ptr,int size,int (*getNumber)(void)) //注意這里引用的格式
{
    int i;
    for(i = 0;i<size;i++)
    {
        ptr[i] = getNumber();
    }
}
int main()
{
    int data[10];
    int i = 10;
    GetArr(data,10,getNumber);
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    }
    printf("\n");
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呢灶,一起剝皮案震驚了整個(gè)濱河市吴超,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸯乃,老刑警劉巖鲸阻,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缨睡,居然都是意外死亡鸟悴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門奖年,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)细诸,“玉大人,你說(shuō)我怎么就攤上這事拾并∽嵫撸” “怎么了鹏浅?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵嗅义,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我隐砸,道長(zhǎng)之碗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任季希,我火速辦了婚禮褪那,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘式塌。我一直安慰自己博敬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布妆艘。 她就那樣靜靜地躺著破加,像睡著了一般秸滴。 火紅的嫁衣襯著肌膚如雪绳泉。 梳的紋絲不亂的頭發(fā)上祭往,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天伦意,我揣著相機(jī)與錄音,去河邊找鬼硼补。 笑死驮肉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的已骇。 我是一名探鬼主播离钝,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疾捍!你這毒婦竟也來(lái)了奈辰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乱豆,失蹤者是張志新(化名)和其女友劉穎奖恰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宛裕,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑟啃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揩尸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛹屿。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岩榆,靈堂內(nèi)的尸體忽然破棺而出错负,到底是詐尸還是另有隱情,我是刑警寧澤勇边,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布犹撒,位于F島的核電站,受9級(jí)特大地震影響粒褒,放射性物質(zhì)發(fā)生泄漏识颊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一奕坟、第九天 我趴在偏房一處隱蔽的房頂上張望祥款。 院中可真熱鬧,春花似錦月杉、人聲如沸刃跛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桨昙。三九已至跌帐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绊率,已是汗流浹背谨敛。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滤否,地道東北人脸狸。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像藐俺,于是被迫代替她去往敵國(guó)和親炊甲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361