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