C語言中各類指標的用法(小結)
阿新 • • 發佈:2020-02-03
一、指標的大小
二、野指標和空指標
#include <stdio.h> int main(void) { int a = 6; int* p; p = a;//把a的值賦給指標變數p,p為野指標,這樣做不會出現啥問題,但是沒什麼意義 p = 0x456;//為指標變數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; }
程式執行結果:
萬能指標可以接收任意型別變數的記憶體地址。
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的大小。
指標的減法運算是類似的,很容易理解。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。