變量,變量名,變量的值,指針變量概念
變量
其值可以改變的量稱這變量。一個變量應該有一個名字,在內存中占據一定的存儲單元。變量在使用前必須要定義。
變量名
變量名是在,變量的聲明的時候,該名字就和內存中一塊地址綁定在一起了。可以通過變量名直接找到對應的內存區域,也可以通過地址找到其內存區域。因此有了引入指針的依據。
變量的值
變量的值是變量所對應的內存區域內存放的二進制序列。當該變量被聲明成整形時,內存區域的二進制序列被以整形的形式翻譯出來。比如:int a = 97; 其在內存中是以97的二進制形式存放的,當使用時,他會被以10進制形式表現出來。同樣的char a = ‘a’; a的ASIIC碼是97,也是以97的二進制存放的,使用時,會被以字符a的形式表現出來。
指針變量
指針變量也是變量,但指針變量里的二進制序列被翻譯成一個地址。指針變量的定義,比如定義一個整形指針變量 int * 。
定義一個整型int i變量,并賦值100。
int i = 100
;
這時變量i在內存的分配情況如下圖所示
對i進行操作,獲取到i的值和地址。
void main(){
int i = 100;
printf("i 的值 = %d\n",i);
printf("i 的地址 = %#x\n",&i);
}
定義一個整型指針變量int* p。
int i = 100;
printf("i 的值 = %d\n",i);
printf("i 的地址 = %#x\n",&i);
int* p = &i;
printf("p 的值 %#x\n",p);
printf("p 的地址 %#x\n",&p);
指針變量的內存情況如圖
指針變量也是變量,所以變量名p也會和一塊內存地址綁定在一起,但是指針變量的值是存放地址,在指針的世界里,一切的都是地址。
如果要操作p指針變量的值
指針變量的值 是 一個地址,操作指針變量的值,相當于要操作該地址的值。
通過*
符號來操作改地址的值。
void main(){
int i = 100;
printf("i 的值 = %d\n",i);
printf("i 的地址 = %#x\n",&i);
int* p = &i;
printf("p 的值 %#x\n",p);
printf("p 的地址 %#x\n",&p);
(*p)++;
printf("p 的地址的值 %d\n",*p);
printf("i 的值 %d\n",i);
}
結果:
二級指針
了解了上面的一級指針,二級指針也就是指針的指針。定義二級指針變量 ,比如定義一個整形的二級指針變量int **。
二級指針二個*
符號,多級指針就多個 *
符號。
void main(){
int i = 100;
printf("i 的值 = %d\n",i);
printf("i 的地址 = %#x\n",&i);
int* p = &i;
printf("p 的值 %#x\n",p);
printf("p 的地址 %#x\n",&p);
(*p)++;
printf("p 的地址的值 %d\n",*p);
printf("i 的值 %d\n",i);
//二級指針
printf("http:///////////////////////////二級指針/////////////////////////\n");
int** p1 = &p;
printf("p1 的值 %#x\n",p1);
printf("p1 的地址 %#x\n",&p1);
//操作二級指針的值
//從二級指針的內存關系圖可以看出
//先找到一級指針p
(*p1); //找到一級指針
(*(*p1))++; //
printf("p 的地址的值 %d\n",*p);
printf("i 的值 %d\n",i);
printf("p1 的值 %d\n",**p1);
}
此時內存地址的情況如下圖:
多級指針也是同樣的原理,使用*
符號一直往前找,找到一級指針。
指針與數組
int arr[] = {1,2,4,5,6};
int len = sizeof(arr)/sizeof(arr[0]);
for(int i = 0; i < len ;i++){
printf(" arr[%d] 的地址 %#x \n",i,&arr[i]);
}
int* arrP = &arr;
printf("arrP的值 %#x\n",arrP);
printf("arrP的地址 %#x\n",&arrP);
for(int i = 0 ;i < len ;i++){
printf("arrP的值 %d\n",*arrP);
arrP++;
}
內存情況如下圖:
當一個指針指向一個數組,其實就是指向了一個數組的首地址,因為數組在內存分配空間是連續的。(不要看到上面的圖,覺得不是連續的,其實連續的),int類型占用4個字節空間。
通過變量指針arrP進行arrP++操作 , 來獲取到數組中的值 。通過同類型的指針 , 進行指針運算來進行內存操作 , 值得注意的是 , 指針類型必須和數組類型一致 ,才能進行內存操作。
END。