欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言超詳細(xì)講解指針的使用

 更新時(shí)間:2022年05月21日 09:33:46   作者:Humboldt  
C語(yǔ)言這門(mén)課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語(yǔ)言的學(xué)習(xí),對(duì)指針的掌握是非常重要的,本文將具體針對(duì)指針的基礎(chǔ)做詳盡的介紹

指針概述

C語(yǔ)言中指針也可以認(rèn)為是一種類(lèi)型,不同于數(shù)值型和字符型的類(lèi)型。推演過(guò)去指針變量也就是相當(dāng)于不同的變量類(lèi)型,不同于數(shù)值變量、字符型變量、字符串變量。

指針變量?jī)煞N類(lèi)型:自身類(lèi)型和指向的類(lèi)型

自身類(lèi)型:將變量名去掉,剩下的就是指針變量類(lèi)型。

指向類(lèi)型:將變量名和離它最近的一個(gè)*去掉,剩下的類(lèi)型就是指針指向的類(lèi)型

int num = 10;
int* p = NULL;
p = #

如代碼中 指針變量的自身類(lèi)型是 int * 型;指向類(lèi)型是 int 型。

自身類(lèi)型

自身類(lèi)型是指變量p本身的類(lèi)型,變量p中放的是地址內(nèi)容,地址指向的是放整型的數(shù)據(jù),為什么需要說(shuō)是指向整型的地址呢?因?yàn)椴煌?lèi)型數(shù)據(jù)占據(jù)的不同大小的一整塊內(nèi)存,整型是一個(gè)占4字節(jié)大小的一個(gè)整體內(nèi)存,字符型是一個(gè)占2個(gè)字節(jié)大小的一個(gè)整體內(nèi)存,編譯器不會(huì)把它們拆分開(kāi)。如定義了一個(gè)int型變量,它的地址是0x7fffffff00,緊接著馬上定義一個(gè)char型變量,他的地址就直接到了0x7fffffff04。從0x7fffffff00 ~ 0x7fffffff04中間不會(huì)再被分開(kāi)了放int型數(shù)據(jù),0x7fffffff04 ~ 0x7fffffff06中間不分開(kāi)放char型數(shù)據(jù)。

所以 自身類(lèi)型 是基本類(lèi)型 + *組合而成,雖然里面放的都是地址,但是地址指向的一整塊內(nèi)容是有區(qū)別的。

指向類(lèi)型

指向類(lèi)型 是指 指針變量中放置的地址是指向的內(nèi)容類(lèi)型。

int num = 10;
int* p = NULL;
p = #
int** pp = NULL;
pp = &p;

這是一個(gè)二級(jí)指針,指向的類(lèi)型是int*,說(shuō)明變量pp指向的是指針類(lèi)型的數(shù)據(jù)。

代碼例子

代碼1

 #include <stdio.h>
 int main()
 {
     int num = 100;
     printf("num = %d, num address = %#lx\n", num, &num);
     //num = 100, num address = 0x7ffd4376ff4c   
     int* p = NULL;
     p = &num;
     printf("*p = %d, p =  %#lx, &p = %#lx\n", *p, p, &p);
     //*p = 100, p =  0x7ffd4376ff4c, &p = 0x7ffd4376ff40
     int** pp = NULL;
     pp = &p;
     printf("**pp = %d, *pp = %#lx, pp = %#lx\n", **pp, *pp, pp);
     //**pp = 100, *pp = 0x7ffd4376ff4c, pp = 0x7ffd4376ff40
     int arr[5]= {10,20,30,40,50};
     printf("arr address = %#lx, arr[0] address = %#lx, arr[0] = %d\n",arr,&arr[0],arr[0]);
     //arr address = 0x7ffd4376ff20, arr[0] address = 0x7ffd4376ff20, arr[0] = 10    
     int* parr = NULL;
     parr = arr;
     printf("parr = %#lx, *parr = %d, *(parr+2) = %d\n",parr,*parr,*(parr+2));
     //parr = 0x7ffd4376ff20, *parr = 10, *(parr+2) = 30
     char str[6]= {'a','d','m','i','n','\0'};
     printf("str address = %#lx, str[0] address = %#lx, str[1]= %c\n", str, &str[0],str[1]);
     //str address = 0x7ffd4376ff10, str[0] address = 0x7ffd4376ff10, str[1]= d  
     char* pstr = NULL;
     pstr = str;
     printf("pstr = %#lx,*pstr = %c,*(pstr+2)= %c\n",pstr,*pstr,*(pstr+2));
     //pstr = 0x7ffd4376ff10,*pstr = a,*(pstr+2)= m
     char str2[6] = "admin";
     printf("str2 = %#lx, str2[0] address = %#lx, str2 = %s, str2[1]= %c\n",str2,&str2[0],str2,str2[1]);
     //str2 = 0x7ffd4376ff00, str2[0] address = 0x7ffd4376ff00, str2 = admin, str2[1]= d
     char* pstr2 = NULL;
     pstr2 = str2;
     printf("pstr2 = %#lx, pstr2 = %s\n",pstr2, pstr2);
     //pstr2 = 0x7ffd4376ff00, pstr2 = admin       
 }

代碼2

#include <stdio.h>
int main()
 {
     float num = 10;
     printf("num = %f, &num = %#lx\n\n", num, &num);
     //num = 10.000000, &num = 0x7ffcdf7ffd94
     float* pnum = &num;
     printf("*pnum = %f, pnum = %#lx, &pnum = %#lx\n\n ", *pnum, pnum, &pnum);
     //*pnum = 10.000000, pnum = 0x7ffcdf7ffd94, &pnum = 0x7ffcdf7ffd88
     float** p_pnum = &pnum;
     printf("**p_pnum = %f, *p_pnum = %#lx, p_pnum = %#lx\n\n",**p_pnum,*p_pnum,p_pnum);
     //**p_pnum = 10.000000, *p_pnum = 0x7ffcdf7ffd94, p_pnum = 0x7ffcdf7ffd88
     char arr[10] = {'a','d','m','i','n'};
     printf("arr[0]= %c, arr[5]= %c, arr[6]= %c, arr = %s\n",arr[0],arr[5],arr[6],arr);
     printf("&arr[0]= %#lx, &arr[1]= %#lx, arr= %#lx\n\n", &arr[0], &arr[1], arr);
     //arr[0]= a, arr[5]= , arr[6]= , arr = admin
     //&arr[0]= 0x7ffcdf7ffd70, &arr[1]= 0x7ffcdf7ffd71, arr= 0x7ffcdf7ffd70
     char* parr = NULL;
     parr = arr;
     printf("*parr = %c, *(parr+4)=%c, *(parr+5)=%c, parr = %s\n",*parr,*(parr+4),*(parr+5),parr);
     printf("parr = %#lx, parr+4 = %#lx, parr+5= %#lx\n\n", parr, parr+4, parr+5);
     //*parr = a, *(parr+4)=n, *(parr+5)=, parr = admin
     //parr = 0x7ffcdf7ffd70, parr+4 = 0x7ffcdf7ffd74, parr+5= 0x7ffcdf7ffd75     
     char str[10]= "admin";
     printf("str[0]= %c, str[5]= %c, str[6]= %c, str = %s\n",str[0],str[5],str[6],str);
     printf("&str[0]= %#lx, &str[1]= %#lx, str = %#lx\n\n", &str[0], &str[1], str);
     //str[0]= a, str[5]= , str[6]= , str = admin
     //&str[0]= 0x7ffcdf7ffd60, &str[1]= 0x7ffcdf7ffd61, str = 0x7ffcdf7ffd60
     char* pstr = NULL;
     pstr = str;
     printf("*pstr= %c, *(pstr+4)= %c, *(pstr+5)= %c, pstr = %s\n", *pstr, *(pstr+4), *(pstr+5), pstr);
     printf("pstr = %#lx, pstr+4=%#lx, pstr+5= %#lx\n\n",pstr, pstr+4, pstr+5);
     //*pstr= a, *(pstr+4)= n, *(pstr+5)= , pstr = admin
     //pstr = 0x7ffcdf7ffd60, pstr+4=0x7ffcdf7ffd64, pstr+5= 0x7ffcdf7ffd65
 }

數(shù)值型指針

數(shù)值型指針: int* p;

如:

int num = 100;
int* p = &num;		//同時(shí)定義和初始化
int* p1 = NULL;		//定義
p1 = &num;			//初始化

字符型指針

字符型指針可以分為指針指向的是單字符還是字符數(shù)組兩種

單字符

字符型指針: char* p;

char name = 'a';
char* p = &name;
printf("p = %c",*p);	//結(jié)果是 a

這里需要注意需要用 占位符 %c 去承接內(nèi)容(或者說(shuō)顯示內(nèi)容)

字符數(shù)組

字符型指針:char* p;

char arr[6] = {'a','d','m','i','n','\0'};
printf("arr = %s, arr = %#lx\n",arr,arr);	//admin,0x7ffffffc0
printf("arr[0]= %c,arr[1]= %c\n",arr[0],arr[1]);//a,d
char* parr = NULL;
parr = arr;     //也可以 parr =  &arr,但是編譯時(shí)會(huì)報(bào)warning
printf("parr = %s, parr = %#lx\n", parr,parr);	//admin,0x7ffffffc0
printf("*(parr)= %c,*(parr + 1) = %c\n",*parr, *(parr+1));  

這里需要注意字符數(shù)組末尾需要加‘\0’字符表示字符數(shù)組結(jié)束,或者編譯器自己會(huì)自動(dòng)加上,所以在定義字符數(shù)組長(zhǎng)度時(shí)需要加+1。

注意 字符數(shù)組名既可以表示地址也可以表示整個(gè)字符數(shù)組的內(nèi)容,而不是第一個(gè)字符。相應(yīng)的指針也是整個(gè)字符數(shù)組的內(nèi)容。

printf("arr = %c\n", arr);		
printf("parr = %c\n", parr);

以上兩行代碼可以編譯過(guò)但是不能顯示內(nèi)容,需要用占位符%s去承接整個(gè)字符數(shù)組內(nèi)容。

字符串型指針

字符型指針:char* p;

char str[5] = "admin";
printf("str = %s,str = %#lx\n",str,str); // admin,0x7ffffffe0.
printf("str[0]= %c, str[1]= %c\n",str[0],str[1]);	// a,d
char* pstr = NULL;
pstr = str;
printf("pstr = %s, pstr = %#lx\n",pstr,pstr); // admin,0x7ffffffe0.
printf("*pstr = %c,*(pstr+1) = %c\n",*pstr,*(pstr+1)); // a,d

如代碼中結(jié)果顯示所示,字符串?dāng)?shù)組名即是地址,同時(shí)也是數(shù)組內(nèi)容,根據(jù)占位符的不同顯示不同內(nèi)容,占位符為%s時(shí)顯示字符串,%#lx顯示地址。同樣的對(duì)于賦值給的指針變量也具有同樣的功能。

但是如果這里

printf("str = %c\n",str);	//可以編譯過(guò)但是不顯示任何信息

字符數(shù)組總結(jié)

字符數(shù)組和字符串?dāng)?shù)組名都可以即表示地址又表示地址對(duì)應(yīng)的內(nèi)容,注意看需要它以什么形式顯示,顯示內(nèi)容用%s,顯示地址用%#lx。

字符數(shù)組和字符串?dāng)?shù)組名對(duì)應(yīng)的地址都是第一個(gè)字符所在的地址。如上面的代碼中 &arr[0] 和 arr 得到的地址相同

到此這篇關(guān)于C語(yǔ)言超詳細(xì)講解指針的使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言通過(guò)案例講解并發(fā)編程模型

    C語(yǔ)言通過(guò)案例講解并發(fā)編程模型

    所謂并發(fā)編程是指在一臺(tái)處理器上“同時(shí)”處理多個(gè)任務(wù)。并發(fā)是在同一實(shí)體上的多個(gè)事件。多個(gè)事件在同一時(shí)間間隔發(fā)生,下面我們根據(jù)樣例來(lái)理解
    2022-04-04
  • C++實(shí)現(xiàn)讀入二進(jìn)制數(shù)并轉(zhuǎn)換為十進(jìn)制輸出

    C++實(shí)現(xiàn)讀入二進(jìn)制數(shù)并轉(zhuǎn)換為十進(jìn)制輸出

    本文給大家介紹的是一則使用C++實(shí)現(xiàn)讀入二進(jìn)制數(shù)并轉(zhuǎn)換為十進(jìn)制輸出的代碼,實(shí)現(xiàn)起來(lái)其實(shí)非常簡(jiǎn)單,C++本身就提供了二進(jìn)制類(lèi)庫(kù)的,大家看代碼吧,簡(jiǎn)單又實(shí)用。
    2015-03-03
  • 基于C++制作一個(gè)簡(jiǎn)單的跑酷游戲

    基于C++制作一個(gè)簡(jiǎn)單的跑酷游戲

    這篇文章主要為大家詳細(xì)介紹了如何利用C++制作一個(gè)簡(jiǎn)單的跑酷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-06-06
  • Pipes實(shí)現(xiàn)LeetCode(194.轉(zhuǎn)置文件)

    Pipes實(shí)現(xiàn)LeetCode(194.轉(zhuǎn)置文件)

    這篇文章主要介紹了Pipes實(shí)現(xiàn)LeetCode(194.轉(zhuǎn)置文件),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 單線程會(huì)導(dǎo)致死鎖你知道嗎

    單線程會(huì)導(dǎo)致死鎖你知道嗎

    這篇文章主要為大家詳細(xì)介紹了單線程會(huì)不會(huì)導(dǎo)致死鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • VC++的if語(yǔ)句應(yīng)用范圍分析

    VC++的if語(yǔ)句應(yīng)用范圍分析

    這篇文章主要介紹了VC++的if語(yǔ)句應(yīng)用范圍分析,對(duì)VC++初學(xué)者有很好的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C++14中binary literals的使用詳解

    C++14中binary literals的使用詳解

    這篇文章主要介紹了C++14中binary literals的使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用椎棧

    C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用椎棧

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用椎棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語(yǔ)言深入探究sizeof與整型數(shù)據(jù)存儲(chǔ)及數(shù)據(jù)類(lèi)型取值范圍

    C語(yǔ)言深入探究sizeof與整型數(shù)據(jù)存儲(chǔ)及數(shù)據(jù)類(lèi)型取值范圍

    在main函數(shù)中,sizeof是可以正常工作的,但是在自定義函數(shù)中就不可以了。所以本文將為大家詳細(xì)講解一下關(guān)鍵字sizeof、整型數(shù)據(jù)存儲(chǔ)深入、數(shù)據(jù)類(lèi)型取值范圍深入
    2022-07-07
  • C++中memcpy函數(shù)的使用以及模擬實(shí)現(xiàn)

    C++中memcpy函數(shù)的使用以及模擬實(shí)現(xiàn)

    memcpy是c和c++使用的內(nèi)存拷貝函數(shù),本文主要介紹了C++中memcpy函數(shù)的使用以及模擬實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論