C語言 指針綜合解析

指針總結

部分筆記來源於王道C語言訓練營

指針:變量的地址
指針變量:一個變量專門用來存放另一變量的地址

1.指針的本質

1.1 指針的定義

通過取地址(指針)直接訪問變量
通過指針變量間接訪問另一個變量

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

註意:

(1)指針變量前面的 ∗ * ∗ 表示該變量為指針型變量

int* p=&i;	//變量名為 p,該變量為指向整型數據的指針類型(int*)

(2)在定義指針變量時必須指定其類型

float a;//浮點型變量
int* p=&a; //錯誤,整型變量的指針

(3)取地址運算符和取值運算符混用(兩運算符優先級相同,應自右向左方向結合)

float* p=&a;
&*p;	//先解引用獲得變量a的值,再取該值的存儲地址,等價於&a
*&a;	//先取得變量a的地址,再解引用獲得a的值,等價於a

(4)連續定義多個指針變量

int* a,b,c;	//錯誤,這裡隻有a為整型變量的指針,b,c均為整型變量
int *a,*b,*c; //正確

2.指針的使用場景

2.1 指針的傳遞

值傳遞

點擊逐語句進入change函數體

進入函數體後點擊逐過程

為解決以上問題,引出指針傳遞

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

2.3 指針與自增、自減運算符

∗ * ∗ 和 + + ++ ++ 的優先級相同,混合使用是自右向左看

分析時第一步:先去掉後增或後減
分析時第二步:前面符號的優先級是否高於後增/後減的優先級,若是則先執行前面,否則先執行後面

j=*p++;	等價於 j=*p; p++;

j=(*p)++; 等價於 j=*p; (*p)++;	

int a[3]={2,7,8};
int* p;
p=a;
//p[0]等價於*p
j=p[0]++;	//等價於 j=p[0]; p[0]++;	

2.4 指針與一維數組

函數調用的本質是值傳遞(實參賦值給形參)

數組名在傳遞過程中是弱化為指針的

2.5 指針與動態內存申請(malloc)

C語言的數組長度固定是因為其定義的整型、浮點型、字符型變量,數組變量都在棧空間中,而棧空間的大小在編譯時是確定的。如果使用的空間大小不確定,那麼就要使用堆空間

程序是放在磁盤上的有序的指令集合

程序啟動起來才叫進程

#include<stdlib.h>
void *malloc(size_t size);	//malloc在向堆申請空間,不使用時要釋放
//void* 為無類型指針,並沒有規定指針指向什麼類型的變量 
//malloc並不知道我們申請的空間用來存放什麼類型的數據,
//所以確定要用來存儲什麼類型後,都會將void*強制轉換為對應的類型

申請堆空間

釋放所申請的堆空間

#include<stdlib.h>
void free(void *ptr);

free(p);
p=NULL;	//如果不把p置為NULL,我們把 p稱為野指針
棧空間與堆空間的區別

函數棧空間釋放後,函數內的所有局部變量消失。
棧空間會隨函數的結束而釋放

堆空間不會因函數執行結束而釋放

2.6 字符指針與字符數組的初始化

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

3.二級指針

二級指針隻服務於一級指針的傳遞與偏移

3.1 二級指針的傳遞

要想在子函數中改變一個變量的值,必須把該變量的地址傳進去
要想在子函數中改變一個指針變量的值,必須把該指針變量的地址傳進去

int* p;
int **p1;
p1=&p;	//二級指針的初始化一定是某一個一級指針取地址,&p就是一個二級指針類型

二級指針示例:

一級指針示例:

到此這篇關於C語言 指針綜合解析的文章就介紹到這瞭,更多相關C語言 指針內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: