天天看點

C語言中各類指針的用法

一、指針的大小

C語言中各類指針的用法

二、野指針和空指針

C語言中各類指針的用法
#include <stdio.h>
int main(void)
{
	int a = 6;
	int* p;
	p = a;//把a的值賦給指針變量p,p為野指針,這樣做不會出現啥問題,但是沒什麼意義

	p = 0x456;//為指針變量p指派,p為野指針,這樣做不會出現啥問題,但是沒什麼意義

	*p = 100;//操作野指針指向未知區域,記憶體會出問題,報錯。
	return 0;
}
           

但是,野指針和有效指針變量儲存的都是數值,為了标志此指針變量沒有指向任何變量(空閑可用),C語言中,可以把NULL指派給此指針,這樣就标志此指針為空指針,沒有任何指針。

int* p = NULL;
           

說明:野指針指向一個未知的空間,程式中允許存在野指針。作業系統将0到255作為系統占用不允許通路操作,操作野指針對應的記憶體空間可能會報錯。

#include <stdio.h>
int main(void)
{
	//空指針是指記憶體位址編号為0的空間
	int* p = NULL;
	//操作空指針對應的空間一定會報錯

	*p = 6;  //這樣寫會報錯
	printf("%d\n", *p);

	return 0;

	
}
           

三、萬能指針void*

void*指針可以指向任意變量的記憶體空間:

#include <stdio.h>
int main(void)
{
	//void* p = NULL;
	void* p;
	int a = 6;
	p = (void*)&a; //指向變量時最好轉換為void*

	//使用指針變量指向記憶體時,轉換為int*
	*((int*)p) = 10;  //把a的值修改為10
                          //在通過萬能指針修改變量的值時,需要找到變量對應的指針類型。
	//printf("%p\n", p);
	printf("a = %d\n", a);

	return 0;
}
           

程式執行結果:

C語言中各類指針的用法

萬能指針可以接收任意類型變量的記憶體位址。

void* p = &a;
           

四、const修飾的指針變量

(1)const修飾指針類型

const int* p = &a;
           

這種情況:可以修改指針變量的值,不可以修改指針指向的記憶體空間的值。

#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;  //報錯,提示表達式必須是可修改的左值,因為不可以修改指針指向的記憶體空間的值(a的值)。
	
	printf("%p\n", p); //列印出的p1的值是b的位址,即可以修改指針變量的值。

	return 0;
}
           

(2)const修飾指針變量

int* const p = &a;
           

這種情況:可以修改指針指向的記憶體空間的值,不可以修改指針變量的值。

#include <stdio.h>
int main(void)
{
	int a = 3;
	int b = 6;

	int* const p = &a;
	*p = 100;
	p = &b;//報錯,提示:表達式必須是可修改的左值。即不可以修改指針變量的值

	printf("%d\n", a);//列印出的a的值為100,即可以修改指針指向的記憶體空間的值

	return 0;
}
           

(3)const修飾指針變量和指針類型

const int* const p = &a;
           

我們知道在這種情況下,既不可以修改指針指向的記憶體空間的值,也不可以修改指針變量的值。但是我們仍能通過二級指針來修改指針指向的記憶體空間的值和指針變量的值。

#include <stdio.h>
int main(void)
{
	int a = 2;
	int b = 6;

	const int* const p = &a;
	int** pp = &p;

	**pp = 100;   //把100指派給a,即通過二級指針可以修改a的值,const不起作用了
	printf("%d\n", *p); //列印出的a的值為100

	*pp = &b;   //把b的位址指派給p,通過二級指針可以改變p的值,const不起作用了
	printf("%d\n", *p);//列印出的是b的值,即6

	return 0;
}
           

這也說明了const存在一定的不安全性。

五、指針的加法運算

(1)指針計算不是簡單的整數相加。

(2)如果是一個int*,+1的結果是增加一個int的大小。

(3)如果是一個char*,+1的結果是增加一個char的大小。

指針的減法運算是類似的,很容易了解。

繼續閱讀