前言:C語言中指針玩的是什么,是內存,要想學好指針的小伙伴們要先對數據在內存中是怎么玩的做一番了解~
當在程序中定義一個變量時,系統會根據其數據類型為其開辟內存空間,例如Visual C++為整型變量分配四個字節的空間,為單精度浮點型變量分配四個字節,為字符型變量分配一個字節,內存中每個字節都有自己獨立且唯一的一個編號,這就是地址 ,如下圖,系統為變量i分配了2000~2004的存儲單元。
_訪問變量的方式_有如下圖兩種:
第一種直接訪問方式,直接通過變量名訪問,變量名與地址有一一對應關系,因此按此地址直接對變量i的存儲單元進行訪問;
第二種間接訪問方式,先通過i_pointer找到i的地址的位置,再通過i的所存地址的位置找到i的地址2000,隨后對變量i進行存取操作。間接訪問的方式就要用到指針,所謂指針(2000)即為一個變量的地址,指針變量(i_pointer)是存儲這個地址的用來指向另一個對象的變量。
關鍵字 | 變量類型 |
---|---|
int | 整型變量 |
char | 字符變量 |
類型名* | 指針變量 |
它們之間的關系為:指針變量的值是指針,指針是變量i的地址,變量i存放所需要存放的存儲內容。
圖片的中*為取值運算符,*i_pointer表示對i_pointer中存放的地址進行取值,相當于 變量i。
指針的定義:
基類型 *變量名
例:int *p
char *p
float p
注意 : 此時的與上文中提到的取值運算符并不是一個概念,此時的
*意思是定義一個變量,這個變量是指針變量。
指針的引用:
對指針進行賦值:
以下面程序為例:
int *p;
int a = 3;
p = &a;
*p = 2;
p = &a(&為取地址符,意思是取變量a的地址賦給指針變量P)
*p = 2(p上文中已經提到是對指針變量P中存儲的地址進行取值p相當于變量a,對
*p進行賦值即相當于對變量a進行賦值)
指針變量做函數參數
以定義兩個變量a和b,使其值進行交換為例進行闡述
#include<stdio.h>
//值傳遞
void swap1(int x, int y) {
int z;
z = x;
x = y;
y = z;
}
//地址傳遞
void swap2(int *p1, int *p2) {
int t = *p1;
*p1 = *p2;
*p2 = t;
}
/*
錯誤,指針變量t所指向的內容不可預見,對*t賦值就是向一個未知存儲單元賦值 ,可能操縱到有用信息,
破壞系統的正常工作狀態 ,這種指針叫做**野指針**;
那么如何解決野指針危險性呢:
可以對該指針進行初始化,使其指向NULL,NULL為地址為0的內存地址,在大多數操作系統上,該內存為操作系統保留,
用戶不可操控
*/
//void swap3(int *p1, int *p2) {
// int *t;
// *t = *p1;
// p1 = *p2; //報錯
// p2 = *t;
/
【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!