您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C語言中如何使用指針,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
部分筆記來源于王道C語言訓練營
指針:變量的地址
指針變量:一個變量專門用來存放另一變量的地址
通過取地址(指針)直接訪問變量
通過指針變量間接訪問另一個變量
注意:
(1)指針變量前面的 ? * ? 表示該變量為指針型變量
int* p=&i; //變量名為 p,該變量為指向整型數(shù)據的指針類型(int*)
(2)在定義指針變量時必須指定其類型
float a;//浮點型變量 int* p=&a; //錯誤,整型變量的指針
(3)取地址運算符和取值運算符混用(兩運算符優(yōu)先級相同,應自右向左方向結合)
float* p=&a; &*p; //先解引用獲得變量a的值,再取該值的存儲地址,等價于&a *&a; //先取得變量a的地址,再解引用獲得a的值,等價于a
(4)連續(xù)定義多個指針變量
int* a,b,c; //錯誤,這里只有a為整型變量的指針,b,c均為整型變量 int *a,*b,*c; //正確
值傳遞
點擊逐語句進入change函數(shù)體
進入函數(shù)體后點擊逐過程
為解決以上問題,引出指針傳遞
? * ? 和 + + ++ ++ 的優(yōu)先級相同,混合使用是自右向左看
分析時第一步:先去掉后增或后減
分析時第二步:前面符號的優(yōu)先級是否高于后增/后減的優(yōu)先級,若是則先執(zhí)行前面,否則先執(zhí)行后面
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]++;
函數(shù)調用的本質是值傳遞(實參賦值給形參)
數(shù)組名在傳遞過程中是弱化為指針的
C語言的數(shù)組長度固定是因為其定義的整型、浮點型、字符型變量,數(shù)組變量都在??臻g中,而??臻g的大小在編譯時是確定的。如果使用的空間大小不確定,那么就要使用堆空間
程序是放在磁盤上的有序的指令集合
程序啟動起來才叫進程
#include<stdlib.h> void *malloc(size_t size); //malloc在向堆申請空間,不使用時要釋放 //void* 為無類型指針,并沒有規(guī)定指針指向什么類型的變量 //malloc并不知道我們申請的空間用來存放什么類型的數(shù)據, //所以確定要用來存儲什么類型后,都會將void*強制轉換為對應的類型
申請堆空間
釋放所申請的堆空間
#include<stdlib.h> void free(void *ptr);
free(p); p=NULL; //如果不把p置為NULL,我們把 p稱為野指針
函數(shù)??臻g釋放后,函數(shù)內的所有局部變量消失。
??臻g會隨函數(shù)的結束而釋放
堆空間不會因函數(shù)執(zhí)行結束而釋放
char* p="hello"; //字符指針,把字符串常量"hello"的首地址賦給p char c[10]="hello"; //字符數(shù)組初始化,等價于 strcpy(c,"hello")
二級指針只服務于一級指針的傳遞與偏移
要想在子函數(shù)中改變一個變量的值,必須把該變量的地址傳進去
要想在子函數(shù)中改變一個指針變量的值,必須把該指針變量的地址傳進去
int* p; int **p1; p1=&p; //二級指針的初始化一定是某一個一級指針取地址,&p就是一個二級指針類型
二級指針示例:
一級指針示例:
關于“C語言中如何使用指針”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。