亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

帶你了解C語言的指針

2020-02-24 14:24:23
字體:
來源:轉載
供稿:網友

對于C語言指針是不是很多小伙伴們都不了解呢?我們在了解指針的時候多多少少會有一些比較復雜的,那么下面就讓武林小編帶你了解C語言的指針吧,希望本文內容對你有所幫助。

指針、引用和取值

什么是指針?什么是內存地址?什么叫做指針的取值?指針是一個存儲計算機內存地址的變量。在這份教程里“引用”表示計算機內存地址。從指針指向的內存讀取數據稱作指針的取值。指針可以指向某些具體類型的變量地址,例如int、long和double。指針也可以是void類型、NULL指針和未初始化指針。本文會對上述所有指針類型進行探討。

根據出現的位置不同,操作符 * 既可以用來聲明一個指針變量,也可以用作指針的取值。當用在聲明一個變量時,*表示這里聲明了一個指針。其它情況用到*表示指針的取值。

&是地址操作符,用來引用一個內存地址。通過在變量名字前使用&操作符,我們可以得到該變量的內存地址。

?

?

// 聲明一個int指針
int *ptr;
// 聲明一個int值
int val = 1;
// 為指針分配一個int值的引用
ptr = &val;
// 對指針進行取值,打印存儲在指針地址中的內容
int deref = *ptr;
printf("%d/n", deref);

?

第2行,我們通過*操作符聲明了一個int指針。接著我們聲明了一個int變量并賦值為1。然后我們用int變量的地址初始化我們的int指針。接下來對int指針取值,用變量的內存地址初始化int指針。最終,我們打印輸出變量值,內容為1。

第6行的&val是一個引用。在val變量聲明并初始化內存之后,通過在變量名之前使用地址操作符&我們可以直接引用變量的內存地址。

第8行,我們再一次使用*操作符來對該指針取值,可直接獲得指針指向的內存地址中的數據。由于指針聲明的類型是int,所以取到的值是指針指向的內存地址存儲的int值。

這里可以把指針、引用和值的關系類比為信封、郵箱地址和房子。一個指針就好像是一個信封,我們可以在上面填寫郵寄地址。一個引用(地址)就像是一個郵件地址,它是實際的地址。取值就像是地址對應的房子。我們可以把信封上的地址擦掉,寫上另外一個我們想要的地址,但這個行為對房子沒有任何影響。

void指針、NULL指針和未初始化指針

一個指針可以被聲明為void類型,比如void *x。一個指針可以被賦值為NULL。一個指針變量聲明之后但沒有被賦值,叫做未初始化指針。

?

int *uninit; // int指針未初始化
int *nullptr = NULL; // 初始化為NULL
void *vptr; // void指針未初始化
int val = 1;
int *iptr;
int *castptr;
?
// void類型可以存儲任意類型的指針或引用
iptr = &val;
vptr = iptr;
printf("iptr=%p, vptr=%p/n", iptr, vptr);
?
// 通過顯示轉換,我們可以把一個void指針轉成
// int指針并進行取值
castptr = (int *)vptr;
printf("*castptr=%d/n", *castptr);
?
// 打印null和未初始化指針
printf("uninit=%p, nullptr=%p/n", uninit, nullptr);
// 不知道你會得到怎樣的返回值,會是隨機的垃圾地址嗎?
// printf("*nullptr=%d/n", nullptr);
// 這里會產生一個段錯誤
// printf("*nullptr=%d/n", nullptr);

?

執行上面的代碼,你會得到類似下面對應不同內存地址的輸出。

?

?

iptr=0x7fff94b89c6c, vptr=0x7fff94b89c6c
*castptr=1
uninit=0x7fff94b89d50, nullptr=(nil)

?

第1行我們聲明了一個未初始化int指針。所有的指針在賦值為NULL、一個引用(地址)或者另一個指針之前都是未被初始化的。第2行我們聲明了一個NULL指針。第3行聲明了一個void指針。第4行到第6行聲明了一個int值和幾個int指針。

第9行到11行,我們為int指針賦值為一個引用并把int指針賦值為void指針。void指針可以保存各種其它指針類型。大多數時候它們被用來存儲數據結構??梢宰⒁獾剑?1行我們打印了int和void指針的地址。它們現在指向了同樣的內存地址。所有的指針都存儲了內存地址。它們的類型只在取值時起作用。

第15到16行,我們把void指針轉換為int指針castptr。請注意這里需要顯示轉換。雖然C語言并不要求顯示地轉換,但這樣會增加代碼的可讀性。接著我們對castptr指針取值,值為1。

第19行非常有意思,在這里打印未初始化指針和NULL指針。值得注意的是,未初始化指針是有內存地址的,而且是一個垃圾地址。不知道這個內存地址指向的值是什么。這就是為什么不要對未初始化指針取值的原因。最好的情況是你取到的是垃圾地址接下來你需要對程序進行調試,最壞的情況則會導致程序崩潰。

NULL指針被初始化為o。NULL是一個特殊的地址,用NULL賦值的指針指向的地址為0而不是隨機的地址。只有當你準備使用這個地址時有效。不要對NULL地址取值,否則會產生段錯誤。

指針和數組

C語言的數組表示一段連續的內存空間,用來存儲多個特定類型的對象。與之相反,指針用來存儲單個內存地址。數組和指針不是同一種結構因此不可以互相轉換。而數組變量指向了數組的第一個元素的內存地址。

一個數組變量是一個常量。即使指針變量指向同樣的地址或者一個不同的數組,也不能把指針賦值給數組變量。也不可以將一個數組變量賦值給另一個數組。然而,可以把一個數組變量賦值給指針,這一點似乎讓人感到費解。把數組變量賦值給指針時,實際上是把指向數組第一個元素的地址賦給指針。

?

?

int myarray[4] = {1,2,3,0};
int *ptr = myarray;
printf("*ptr=%d/n", *ptr);
?
// 數組變量是常量,不能做下面的賦值
// myarray = ptr
// myarray = myarray2
// myarray = &myarray2[0]

?

第1行初始化了一個int數組,第2行用數組變量初始化了一個int指針。由于數組變量實際上是第一個元素的地址,因此我們可以把這個地址賦值給指針。這個賦值與int *ptr = &myarray[0]效果相同,顯示地把數組的第一個元素地址賦值到了ptr引用。這里需要注意的是,這里指針需要和數組的元素類型保持一致,除非指針類型為void。

指針與結構體

就像數組一樣,指向結構體的指針存儲了結構體第一個元素的內存地址。與數組指針一樣,結構體的指針必須聲明和結構體類型保持一致,或者聲明為void類型。

?

?

struct person {
? int age;
? char *name;
};
struct person first;
struct person *ptr;
?
first.age = 21;
char *fullname = "full name";
first.name = fullname;
ptr = &first;
?
printf("age=%d, name=%s/n", first.age, ptr->name);

?

第1至6行聲明了一個person結構體,一個變量指向了一個person結構體和指向person結構體的指針。第8行為age成員賦了一個int值。第9至10行我們聲明了一個char指針并賦值給一個char數組并賦值給結構體name成員。第11行我們把一個person結構體引用賦值給結構體變量。

第13行我們打印了結構體實例的age和name。這里需要注意兩個不同的符號,'.' 和 ‘->' 。結構體實例可以通過使用 ‘.' 符號訪問age變量。對于結構體實例的指針,我們可以通過 ‘->' 符號訪問name變量。也可以同樣通過(*ptr).name來訪問name變量。

上文中小編帶你了解C語言的指針之后你是否明白了呢?希望這份簡短的概述能夠有助于了解不同的指針類型。在后續的博文中我們會探討其它類型的指針和高級用法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美做受高潮1| 久久97精品久久久久久久不卡| 日韩国产激情在线| 国产精自产拍久久久久久| 亚洲欧美综合精品久久成人| 欧美视频在线免费看| 国产精品视频地址| 国产97人人超碰caoprom| 国产日韩欧美影视| 国产精品网站入口| 国产精品美女视频网站| 国产一区二区在线免费视频| 日韩免费在线免费观看| 亚洲精品久久久久中文字幕欢迎你| 欧美电影在线观看完整版| 97超碰色婷婷| 日韩中文字幕国产精品| 亚洲国产精品久久精品怡红院| 美女国内精品自产拍在线播放| 亚洲天堂网站在线观看视频| 国产免费一区二区三区在线观看| 57pao国产精品一区| 久久久久久亚洲精品不卡| 日韩精品在线观看视频| 亚洲精品按摩视频| 精品在线观看国产| 国产亚洲精品久久| 国产精品视频公开费视频| 亚洲人成人99网站| 亚洲精品720p| 国产精品专区h在线观看| 国产69久久精品成人| 欧美另类69精品久久久久9999| 亚洲理论在线a中文字幕| 亚洲国产精品va在线看黑人| 91国产一区在线| 韩国三级电影久久久久久| 欧美黑人xxx| 欧美日韩不卡合集视频| 日韩av在线免播放器| 久久6免费高清热精品| 色偷偷噜噜噜亚洲男人的天堂| 色综合伊人色综合网站| 欧美肥臀大乳一区二区免费视频| 国产精品激情自拍| 欧美日韩aaaa| 亚洲a在线观看| 日韩精品中文字幕在线| 日韩精品欧美国产精品忘忧草| 欧美日韩一区二区三区| 大荫蒂欧美视频另类xxxx| 欧美黄色片免费观看| 久久99国产综合精品女同| 在线观看欧美成人| 91亚洲精品视频| 欧美麻豆久久久久久中文| 亚洲香蕉在线观看| 欧美中文字幕视频在线观看| 欧美国产在线视频| 欧美日韩亚洲一区二区| 久久理论片午夜琪琪电影网| 91沈先生作品| 精品中文字幕在线| 亚洲最大在线视频| 福利一区福利二区微拍刺激| 亚洲一区二区三区在线视频| 永久555www成人免费| 亚洲专区国产精品| 日韩精品中文字幕在线| 亚洲国产一区自拍| 亚洲国产精品久久91精品| 欧美主播福利视频| 成人av色在线观看| 91在线免费观看网站| 亚洲成人教育av| 日韩性xxxx爱| 亚洲精品在线观看www| 国产精品视频999| 欧美一区二区.| 国产午夜精品一区二区三区| 成人夜晚看av| 欧美大片欧美激情性色a∨久久| 亚洲a成v人在线观看| 57pao国产精品一区| 欧美性猛交xxxx乱大交| 精品国产自在精品国产浪潮| 午夜欧美大片免费观看| 精品一区二区三区电影| 国产成人亚洲综合91| 在线观看视频亚洲| 亚洲午夜性刺激影院| 欧美精品videos| 欧美在线视频一二三| 国产精品久久网| 亚洲一级黄色片| 国产v综合ⅴ日韩v欧美大片| 日韩精品视频在线观看免费| 亚洲精品日韩丝袜精品| 成人午夜在线影院| 亚洲激情国产精品| 欧美成人全部免费| 成人久久精品视频| 狠狠久久五月精品中文字幕| 亚洲综合精品伊人久久| 亚洲午夜精品久久久久久性色| 亚洲精品一区中文| 国产欧美日韩中文字幕在线| 26uuu亚洲国产精品| 久久久久久久久久婷婷| 亚洲成色999久久网站| 亚洲在线视频福利| 亚洲综合精品伊人久久| 成人激情视频在线播放| 久久精品国产久精国产一老狼| 欧美成人高清视频| 夜夜嗨av色综合久久久综合网| 亚洲va欧美va国产综合剧情| 欧美日韩精品国产| 国产成人精品一区二区三区| 国产亚洲人成a一在线v站| 91精品国产高清久久久久久91| 欧美日韩精品二区| 国产精品爱久久久久久久| 欧美成人精品不卡视频在线观看| 国产精品久久久久久五月尺| 久久久久中文字幕2018| 超碰97人人做人人爱少妇| 欧美性猛交丰臀xxxxx网站| 精品国内亚洲在观看18黄| 亚洲乱亚洲乱妇无码| 精品亚洲夜色av98在线观看| 欧美视频在线免费看| 国产精品xxx视频| 日韩hd视频在线观看| 97涩涩爰在线观看亚洲| 亚洲第一区第一页| 免费av在线一区| 日韩欧美一区二区在线| 欧美wwwwww| 日韩视频在线免费观看| 91免费的视频在线播放| 91精品中国老女人| 亚洲一级免费视频| 国产精品爽爽爽| 亚洲最大成人网色| 欧美大片在线免费观看| 91亚洲va在线va天堂va国| 精品国产一区二区三区久久久| 久久91精品国产91久久久| 中文字幕日韩av电影| 欧美日韩中文字幕在线| 高清欧美性猛交xxxx黑人猛交| 狠狠躁夜夜躁人人爽天天天天97| 亚洲一区av在线播放| 久久久精品一区二区三区| 国产精品露脸av在线| 欧美一级视频在线观看| 国产精品99久久久久久白浆小说| 2018日韩中文字幕| 米奇精品一区二区三区在线观看| 国产欧美一区二区白浆黑人| 尤物九九久久国产精品的特点| 亚洲色图25p| 韩日欧美一区二区|