C語(yǔ)言 指針綜合解析
指針總結(jié)
部分筆記來(lái)源于王道C語(yǔ)言訓(xùn)練營(yíng)
指針:變量的地址
指針變量:一個(gè)變量專門用來(lái)存放另一變量的地址



1.指針的本質(zhì)
1.1 指針的定義

通過(guò)取地址(指針)直接訪問(wèn)變量
通過(guò)指針變量間接訪問(wèn)另一個(gè)變量

1.2 取地址操作符與取值操作符

注意:
(1)指針變量前面的 ∗ * ∗ 表示該變量為指針型變量
int* p=&i; //變量名為 p,該變量為指向整型數(shù)據(jù)的指針類型(int*)
(2)在定義指針變量時(shí)必須指定其類型
float a;//浮點(diǎn)型變量 int* p=&a; //錯(cuò)誤,整型變量的指針
(3)取地址運(yùn)算符和取值運(yùn)算符混用(兩運(yùn)算符優(yōu)先級(jí)相同,應(yīng)自右向左方向結(jié)合)
float* p=&a; &*p; //先解引用獲得變量a的值,再取該值的存儲(chǔ)地址,等價(jià)于&a *&a; //先取得變量a的地址,再解引用獲得a的值,等價(jià)于a
(4)連續(xù)定義多個(gè)指針變量
int* a,b,c; //錯(cuò)誤,這里只有a為整型變量的指針,b,c均為整型變量 int *a,*b,*c; //正確
2.指針的使用場(chǎng)景
2.1 指針的傳遞
值傳遞


點(diǎn)擊逐語(yǔ)句進(jìn)入change函數(shù)體



進(jìn)入函數(shù)體后點(diǎn)擊逐過(guò)程



為解決以上問(wèn)題,引出指針傳遞



2.2 指針的偏移(指針的加減)



2.3 指針與自增、自減運(yùn)算符
∗ * ∗ 和 + + ++ ++ 的優(yōu)先級(jí)相同,混合使用是自右向左看
分析時(shí)第一步:先去掉后增或后減
分析時(shí)第二步:前面符號(hào)的優(yōu)先級(jí)是否高于后增/后減的優(yōu)先級(jí),若是則先執(zhí)行前面,否則先執(zhí)行后面

j=*p++; 等價(jià)于 j=*p; p++;

j=(*p)++; 等價(jià)于 j=*p; (*p)++;

int a[3]={2,7,8};
int* p;
p=a;
//p[0]等價(jià)于*p
j=p[0]++; //等價(jià)于 j=p[0]; p[0]++;


2.4 指針與一維數(shù)組
函數(shù)調(diào)用的本質(zhì)是值傳遞(實(shí)參賦值給形參)
數(shù)組名在傳遞過(guò)程中是弱化為指針的

2.5 指針與動(dòng)態(tài)內(nèi)存申請(qǐng)(malloc)
C語(yǔ)言的數(shù)組長(zhǎng)度固定是因?yàn)槠涠x的整型、浮點(diǎn)型、字符型變量,數(shù)組變量都在棧空間中,而??臻g的大小在編譯時(shí)是確定的。如果使用的空間大小不確定,那么就要使用堆空間
程序是放在磁盤上的有序的指令集合
程序啟動(dòng)起來(lái)才叫進(jìn)程
#include<stdlib.h> void *malloc(size_t size); //malloc在向堆申請(qǐng)空間,不使用時(shí)要釋放 //void* 為無(wú)類型指針,并沒(méi)有規(guī)定指針指向什么類型的變量 //malloc并不知道我們申請(qǐng)的空間用來(lái)存放什么類型的數(shù)據(jù), //所以確定要用來(lái)存儲(chǔ)什么類型后,都會(huì)將void*強(qiáng)制轉(zhuǎn)換為對(duì)應(yīng)的類型

申請(qǐng)堆空間


釋放所申請(qǐng)的堆空間
#include<stdlib.h> void free(void *ptr);

free(p); p=NULL; //如果不把p置為NULL,我們把 p稱為野指針
棧空間與堆空間的區(qū)別
函數(shù)??臻g釋放后,函數(shù)內(nèi)的所有局部變量消失。
??臻g會(huì)隨函數(shù)的結(jié)束而釋放


堆空間不會(huì)因函數(shù)執(zhí)行結(jié)束而釋放

2.6 字符指針與字符數(shù)組的初始化
char* p="hello"; //字符指針,把字符串常量"hello"的首地址賦給p char c[10]="hello"; //字符數(shù)組初始化,等價(jià)于 strcpy(c,"hello")





3.二級(jí)指針
二級(jí)指針只服務(wù)于一級(jí)指針的傳遞與偏移
3.1 二級(jí)指針的傳遞
要想在子函數(shù)中改變一個(gè)變量的值,必須把該變量的地址傳進(jìn)去
要想在子函數(shù)中改變一個(gè)指針變量的值,必須把該指針變量的地址傳進(jìn)去
int* p; int **p1; p1=&p; //二級(jí)指針的初始化一定是某一個(gè)一級(jí)指針取地址,&p就是一個(gè)二級(jí)指針類型
二級(jí)指針示例:


一級(jí)指針示例:

到此這篇關(guān)于C語(yǔ)言 指針綜合解析的文章就介紹到這了,更多相關(guān)C語(yǔ)言 指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++從匯編的視角審視對(duì)象的創(chuàng)建問(wèn)題
這篇文章主要介紹了C++從匯編的視角看對(duì)象的創(chuàng)建,從匯編的視角來(lái)看,調(diào)用構(gòu)造器和調(diào)用 “返回對(duì)象” 的函數(shù)是一樣的,從匯編的角度來(lái)看,對(duì)象就是一堆數(shù)據(jù)的排列,比如說(shuō)最普通的對(duì)象就是數(shù)據(jù)成員按照聲明順序直接排列,需要的朋友可以參考下2022-01-01
詳解C++編程中的條件判斷語(yǔ)句if-else與switch的用法
這篇文章主要介紹了C++編程中的條件判斷語(yǔ)句if-else與switch的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01
項(xiàng)目之C++如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池
這篇文章主要介紹了項(xiàng)目之C++如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
C語(yǔ)言深入講解動(dòng)態(tài)內(nèi)存分配函數(shù)的使用
這篇文章主要介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存分配,C語(yǔ)言內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free、柔性數(shù)組等,下面這篇文章帶大家了解一下2022-05-05
C++實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C語(yǔ)言數(shù)組實(shí)現(xiàn)掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

