C語(yǔ)言清楚了解指針的使用
前言
經(jīng)過(guò)了指針的初步學(xué)習(xí),我們了解了指針有以下特點(diǎn):
1. 指針就是個(gè)變量,用來(lái)存放地址,地址唯一標(biāo)識(shí)一塊內(nèi)存空間。
2. 指針的大小是固定的4/8個(gè)字節(jié)(32位平臺(tái)/64位平臺(tái))。
3. 指針是有類型,指針的類型決定了指針的+-整數(shù)的步長(zhǎng),指針解引用操作的時(shí)候的權(quán)限。
4. 指針的運(yùn)算。
今天將要從各種不同的指針的角度切入,使得我們對(duì)指針的了解更加深入。
字符指針
我們現(xiàn)在已經(jīng)學(xué)會(huì)下面的這種指針的使用了:
int main() { char ch = 'w'; char* pc = &ch; *pc = 'w'; return 0; }
通過(guò)這段代碼,把字符變量ch的地址賦給了pc,同時(shí)pc的類型是char*。
接下來(lái)讓我們來(lái)看一看另一段代碼:
int main() { const char* pstr = "hello bit.";//這里是把一個(gè)字符串放到pstr指針變量里了嗎? printf("%s\n", pstr); return 0; }
我們看到,這里是把一個(gè)字符串常量和指針pstr關(guān)聯(lián)起來(lái)了。并且無(wú)論有沒(méi)有加const,常量的內(nèi)容是不能改變的。
int main() { char* pstr = "hello bit.";//這里是把一個(gè)字符串放到pstr指針變量里了嗎? *pstr = 'w'; printf("%s\n", pstr); return 0; }
當(dāng)我們?nèi)缟蠄D代碼一樣,試圖改變常量字符串時(shí)就會(huì)報(bào)錯(cuò):
讓我們來(lái)通過(guò)下面的代碼了解內(nèi)部的邏輯:
int main() { char str1[] = "hello world."; char str2[] = "hello world."; const char *str3 = "hello world."; const char *str4 = "hello world."; if(str1 ==str2) printf("str1 and str2 are same\n"); else printf("str1 and str2 are not same\n"); if(str3 ==str4) printf("str3 and str4 are same\n"); else printf("str3 and str4 are not same\n"); return 0; }
根據(jù)代碼和運(yùn)行結(jié)果,我們可以知道指針指向的常量字符串的地址是相同的,但把字符串賦予數(shù)組時(shí),地址不同,讓我們用圖來(lái)描述這個(gè)過(guò)程。
同時(shí)str1,str2,str3,str4,指的都是字符串首字符的地址。
指針數(shù)組
指針數(shù)組的本質(zhì)是數(shù)組,只是在數(shù)組中存放的內(nèi)容是指針變量。
接下來(lái)讓我們看看指針數(shù)組長(zhǎng)什么樣:
int* arr1[10]; //整形指針的數(shù)組 char *arr2[4]; //一級(jí)字符指針的數(shù)組 char **arr3[5];//二級(jí)字符指針的數(shù)組
指針數(shù)組可以類比普通數(shù)組,比如:
我們可以發(fā)現(xiàn),指針數(shù)組和普通數(shù)組的區(qū)別僅僅是數(shù)組中儲(chǔ)存的元素類型不一樣,所以說(shuō)指針數(shù)組本質(zhì)上還是數(shù)組。
數(shù)組指針
說(shuō)完了指針數(shù)組,讓我們來(lái)了解一下數(shù)組指針 ,數(shù)組指針本質(zhì)上是一個(gè)指針。接下來(lái)讓我們類比一下數(shù)組指針和我們常見的指針:
讓我們通過(guò)一段代碼來(lái)深入了解 數(shù)組指針的特點(diǎn):
int main() { int arr[10] = { 0 }; printf("arr = %p\n", arr); printf("&arr= %p\n", &arr); printf("arr+1 = %p\n", arr + 1); printf("&arr+1= %p\n", &arr + 1); return 0; }
通過(guò)學(xué)習(xí)我們知道arr是數(shù)組首元素的地址,&arr是整個(gè)數(shù)組的地址,可類比為普通指針和數(shù)組指針。
函數(shù)指針
函數(shù)指針就是存放函數(shù)地址的指針 ,通過(guò)函數(shù)指針可以調(diào)用相應(yīng)的函數(shù)。
void test() { printf("hehe\n"); } int main() { printf("%p\n", test); printf("%p\n", &test); return 0; }
通過(guò)這段代碼我們了解到,函數(shù)是有地址的,那怎么把這個(gè)地址賦予指針呢?
void test() { printf("hehe\n"); } int main() { printf("%p\n", test); printf("%p\n", &test); void (*p)() = test; (*p)(); return 0; }
以上代碼讓我們知道了,函數(shù)是可以通過(guò)指針調(diào)用的。
到此這篇關(guān)于C語(yǔ)言清楚了解指針的使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++用指針變量作為函數(shù)的參數(shù)接受數(shù)組的值的問(wèn)題詳細(xì)總結(jié)
以下是對(duì)C++中用指針變量作為函數(shù)的參數(shù)接受數(shù)組的值的問(wèn)題進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10C++中map和vector作形參時(shí)如何給定默認(rèn)參數(shù)?
今天小編就為大家分享一篇關(guān)于C++中map和vector作形參時(shí)如何給定默認(rèn)參數(shù)?,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04C++之CNoTrackObject類和new delete操作符的重載實(shí)例
這篇文章主要介紹了C++之CNoTrackObject類和new delete操作符的重載實(shí)例,是C++程序設(shè)計(jì)中比較重要的概念,需要的朋友可以參考下2014-10-10c++11中regex正則表達(dá)式示例簡(jiǎn)述
這篇文章主要給大家介紹了關(guān)于c++11中regex正則表達(dá)式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++11具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11C++定時(shí)器Timer在項(xiàng)目中的使用方法
這篇文章主要給大家介紹了關(guān)于C++定時(shí)器Timer在項(xiàng)目中的基本使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05C/C++ Qt 數(shù)據(jù)庫(kù)與Chart歷史數(shù)據(jù)展示
這篇文章主要介紹了Qt利用Qchart組件展示數(shù)據(jù)庫(kù)中的歷史數(shù)據(jù)。文中的示例代碼講解清晰,具有一定的學(xué)習(xí)和工作價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12C++實(shí)現(xiàn)快捷店會(huì)員管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快捷店會(huì)員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03