C語(yǔ)言中各類指針的用法(小結(jié))
一、指針的大小
二、野指針和空指針
#include <stdio.h> int main(void) { int a = 6; int* p; p = a;//把a(bǔ)的值賦給指針變量p,p為野指針,這樣做不會(huì)出現(xiàn)啥問題,但是沒什么意義 p = 0x456;//為指針變量p賦值,p為野指針,這樣做不會(huì)出現(xiàn)啥問題,但是沒什么意義 *p = 100;//操作野指針指向未知區(qū)域,內(nèi)存會(huì)出問題,報(bào)錯(cuò)。 return 0; }
但是,野指針和有效指針變量保存的都是數(shù)值,為了標(biāo)志此指針變量沒有指向任何變量(空閑可用),C語(yǔ)言中,可以把NULL賦值給此指針,這樣就標(biāo)志此指針為空指針,沒有任何指針。
int* p = NULL;
說明:野指針指向一個(gè)未知的空間,程序中允許存在野指針。操作系統(tǒng)將0到255作為系統(tǒng)占用不允許訪問操作,操作野指針對(duì)應(yīng)的內(nèi)存空間可能會(huì)報(bào)錯(cuò)。
#include <stdio.h> int main(void) { //空指針是指內(nèi)存地址編號(hào)為0的空間 int* p = NULL; //操作空指針對(duì)應(yīng)的空間一定會(huì)報(bào)錯(cuò) *p = 6; //這樣寫會(huì)報(bào)錯(cuò) printf("%d\n", *p); return 0; }
三、萬(wàn)能指針void*
void*指針可以指向任意變量的內(nèi)存空間:
#include <stdio.h> int main(void) { //void* p = NULL; void* p; int a = 6; p = (void*)&a; //指向變量時(shí)最好轉(zhuǎn)換為void* //使用指針變量指向內(nèi)存時(shí),轉(zhuǎn)換為int* *((int*)p) = 10; //把a(bǔ)的值修改為10 //在通過萬(wàn)能指針修改變量的值時(shí),需要找到變量對(duì)應(yīng)的指針類型。 //printf("%p\n", p); printf("a = %d\n", a); return 0; }
程序執(zhí)行結(jié)果:
萬(wàn)能指針可以接收任意類型變量的內(nèi)存地址。
void* p = &a;
四、const修飾的指針變量
(1)const修飾指針類型
const int* p = &a;
這種情況:可以修改指針變量的值,不可以修改指針指向的內(nèi)存空間的值。
#include <stdio.h> int main(void) { int a = 3; int b = 6; const int* p = &a; //p1的初始值是a的地址 p = &b; //把b的地址賦給p1,即改變p1的值(這是可行的) *p = 15; //報(bào)錯(cuò),提示表達(dá)式必須是可修改的左值,因?yàn)椴豢梢孕薷闹羔樦赶虻膬?nèi)存空間的值(a的值)。 printf("%p\n", p); //打印出的p1的值是b的地址,即可以修改指針變量的值。 return 0; }
(2)const修飾指針變量
int* const p = &a;
這種情況:可以修改指針指向的內(nèi)存空間的值,不可以修改指針變量的值。
#include <stdio.h> int main(void) { int a = 3; int b = 6; int* const p = &a; *p = 100; p = &b;//報(bào)錯(cuò),提示:表達(dá)式必須是可修改的左值。即不可以修改指針變量的值 printf("%d\n", a);//打印出的a的值為100,即可以修改指針指向的內(nèi)存空間的值 return 0; }
(3)const修飾指針變量和指針類型
const int* const p = &a;
我們知道在這種情況下,既不可以修改指針指向的內(nèi)存空間的值,也不可以修改指針變量的值。但是我們?nèi)阅芡ㄟ^二級(jí)指針來修改指針指向的內(nèi)存空間的值和指針變量的值。
#include <stdio.h> int main(void) { int a = 2; int b = 6; const int* const p = &a; int** pp = &p; **pp = 100; //把100賦值給a,即通過二級(jí)指針可以修改a的值,const不起作用了 printf("%d\n", *p); //打印出的a的值為100 *pp = &b; //把b的地址賦值給p,通過二級(jí)指針可以改變p的值,const不起作用了 printf("%d\n", *p);//打印出的是b的值,即6 return 0; }
這也說明了const存在一定的不安全性。
五、指針的加法運(yùn)算
(1)指針計(jì)算不是簡(jiǎn)單的整數(shù)相加。
(2)如果是一個(gè)int*,+1的結(jié)果是增加一個(gè)int的大小。
(3)如果是一個(gè)char*,+1的結(jié)果是增加一個(gè)char的大小。
指針的減法運(yùn)算是類似的,很容易理解。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言指針基礎(chǔ)知識(shí)實(shí)例講解
這篇文章主要介紹了C語(yǔ)言指針基本知識(shí)實(shí)例講解,文中實(shí)例講解的很清晰,有不太懂的同學(xué)可以研究下2021-02-02C語(yǔ)言實(shí)現(xiàn)職工工資管理系統(tǒng)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)職工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02淺析C/C++中的可變參數(shù)與默認(rèn)參數(shù)
C支持可變參數(shù)的函數(shù),這里的意思是C支持函數(shù)帶有可變數(shù)量的參數(shù),最常見的例子就是我們十分熟悉的printf()系列函數(shù)。我們還知道在函數(shù)調(diào)用時(shí)參數(shù)是自右向左壓棧的2013-09-09