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++ 遞歸遍歷文件并計(jì)算MD5的實(shí)例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于C++ 遞歸遍歷文件并計(jì)算MD5的實(shí)例代碼,有興趣的朋友們可以學(xué)習(xí)參考下。2021-07-07
c++中數(shù)字與字符串之間的轉(zhuǎn)換方法(推薦)
下面小編就為大家?guī)硪黄猚++中數(shù)字與字符串之間的轉(zhuǎn)換方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
C++實(shí)現(xiàn)LeetCode(135.分糖果問題)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(135.分糖果問題),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語言實(shí)現(xiàn)飛機(jī)游戲(豪華版)的示例代碼
在前文中已經(jīng)實(shí)現(xiàn)了基礎(chǔ)版和進(jìn)階版的飛機(jī)游戲,但是存在的問題很明顯:已經(jīng)發(fā)射出去的子彈會隨著飛機(jī)位置的實(shí)時(shí)改變而改變,并且不能實(shí)現(xiàn)連發(fā)。本篇文章將利用數(shù)組進(jìn)一步改進(jìn)空戰(zhàn)游戲,感興趣的可以了解一下2022-10-10

