C語言 從根本上理解指針
一、* 的意義
- 在指針聲明時(shí),* 號表示所聲明的變量為指針
- 在指針使用時(shí),* 號表示取指針?biāo)赶虻膬?nèi)存空間中的值
如下:
int i = 0; int j = 0; int* p = &i; //指針聲明 j = *p; //取值
變量 p 保存著變量 i 的內(nèi)存地址,即:p <--> &i *p <--> i
* 號類似一把鑰匙,通過這把鑰匙可以打開內(nèi)存,讀取內(nèi)存中的值。
下面看一個(gè)指針的使用示例:
#include <stdio.h> int main() { int i = 0; int* pI; char* pC; float* pF; pI = &i; *pI = 10; printf("%p, %p, %d\n", pI, &i, i); printf("%d, %d, %p\n", sizeof(int*), sizeof(pI), &pI); printf("%d, %d, %p\n", sizeof(char*), sizeof(pC), &pC); printf("%d, %d, %p\n", sizeof(float*), sizeof(pF), &pF); return 0; }
輸出結(jié)果如下:
所有 32 位系統(tǒng)上的指針變量占用內(nèi)存大小都為 4 個(gè)字節(jié)。
二、傳值調(diào)用與傳址調(diào)用
- 指針是變量,因此可以聲明指針參數(shù)
- 當(dāng)一個(gè)函數(shù)體內(nèi)部需要改變實(shí)參的值,則需要使用指針參數(shù)
- 函數(shù)調(diào)用時(shí)實(shí)參值將復(fù)制到形參
- 指針適用于復(fù)雜數(shù)據(jù)類型作為參數(shù)的函數(shù)中
下面看一個(gè)利用指針交換變量的代碼:
#include <stdio.h> int swap(int* a, int* b) { int c = *a; *a = *b; *b = c; } int main() { int aa = 1; int bb = 2; printf("aa = %d, bb = %d\n", aa, bb); swap(&aa, &bb); printf("aa = %d, bb = %d\n", aa, bb); return 0; }
輸出結(jié)果如下:
三、常量與指針
const int* p; //p 可變,p 指向的內(nèi)容不可變
int const* p; //p 可變,p 指向的內(nèi)容不可變
int* const p; //p 不可變,p 指向的內(nèi)容可變
const int* const p; //p 和 p 指向的內(nèi)容都不可變
口訣:左數(shù)右指
當(dāng) const 出現(xiàn)在 * 號左邊時(shí)指針指向的數(shù)據(jù)為常量,當(dāng) const 出現(xiàn)在 * 后右邊時(shí)指針本身為常量
下面通過一個(gè)例子加深理解:
#include <stdio.h> int main() { int i = 0; const int* p1 = &i; int const* p2 = &i; int* const p3 = &i; const int* const p4 = &i; *p1 = 1; // compile error p1 = NULL; // ok *p2 = 2; // compile error p2 = NULL; // ok *p3 = 3; // ok p3 = NULL; // compile error *p4 = 4; // compile error p4 = NULL; // compile error return 0; }
輸出結(jié)果如下:
四、小結(jié)
- 指針是 C 語言中一種特別的變量
- 指針?biāo)4娴闹凳莾?nèi)存的地址
- 可以通過指針修改內(nèi)存中的任意地址內(nèi)容
到此這篇關(guān)于C語言 從根本上理解指針的文章就介紹到這了,更多相關(guān)C語言 指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++將引用或者是指針作為函數(shù)參數(shù)實(shí)現(xiàn)實(shí)參的運(yùn)算
這篇文章主要介紹了c++將引用或者是指針作為函數(shù)參數(shù)實(shí)現(xiàn)實(shí)參的運(yùn)算,需要的朋友可以參考下2014-05-05C++ 關(guān)于 CMFCPropertyGridCtrl 的使用方法
這篇文章主要介紹了C++ 關(guān)于 CMFCPropertyGridCtrl 的使用方法的相關(guān)資料,需要的朋友可以參考下2015-06-06C++通過共享內(nèi)存ShellCode實(shí)現(xiàn)跨進(jìn)程傳輸
在計(jì)算機(jī)安全領(lǐng)域,ShellCode是一段用于利用系統(tǒng)漏洞或執(zhí)行特定任務(wù)的機(jī)器碼,本文主要為大家介紹了C++如何通過共享內(nèi)存ShellCode實(shí)現(xiàn)跨進(jìn)程傳輸,需要的可以參考下2023-12-12C++中的static和const的關(guān)鍵字用法詳解
這篇文章主要介紹了C++中的static和const的關(guān)鍵字用法詳解,這是一道經(jīng)常在面試中被問到的知識,本文給大家詳細(xì)介紹下,需要的朋友可以參考下2023-06-06用C語言實(shí)現(xiàn)圣誕樹(簡易版+進(jìn)階版)
大家好,本篇文章主要講的是用C語言實(shí)現(xiàn)圣誕樹(簡易版+進(jìn)階版),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12C++學(xué)習(xí)之如何進(jìn)行內(nèi)存資源管理
與java、golang等自帶垃圾回收機(jī)制的語言不同,C++并不會自動回收內(nèi)存,這往往會導(dǎo)致內(nèi)存泄漏和內(nèi)存溢出等問題,所以掌握C++中的內(nèi)存管理技巧和工具是非常重要的,本文就來和大家詳細(xì)講講2023-05-05基于Opencv實(shí)現(xiàn)雙目攝像頭拍照程序
這篇文章主要為大家詳細(xì)介紹了基于Opencv實(shí)現(xiàn)雙目攝像頭拍照程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04C++構(gòu)造函數(shù)深度學(xué)習(xí)
這篇文章主要為大家詳細(xì)介紹了C++構(gòu)造函數(shù),深度學(xué)習(xí)C++構(gòu)造函數(shù),感興趣的小伙伴們可以參考一下2016-08-08