初識指標中的易混淆點
阿新 • • 發佈:2021-01-28
探討的問題
1.指標和指標型別
我們都知道指標是一個變數,是一個存放地址的變數。既然如此我們為何不單獨定義一個型別呢?而是要用其他型別加星號來作為指標變數,有什麼作用呢?
1.決定了指標的訪問許可權,也就是能訪問幾個位元組。
int main()
{
int a = 0x11223344;//一個十六進位制位佔4個位元位
int *p = &a;
*p = 0;
return 0;
}
通過除錯檢視記憶體,可以看出a的記憶體是
當*p等於0的時候記憶體的變化,記憶體塊裡的4個位元組全部變成0,
int main()
{
int a = 0x11223344 ;//一個十六進位制位佔4個位元位
/*int *p = &a;
*p = 0;*/
char *p = &a;
*p = 0;
return 0;
}
而當使用char型別的指標時,同樣的地址,*p變成0之後,僅第一個位元組變成0
由此可見,指標型別的作用有決定了指標的訪問許可權,也就是能訪問幾個位元組。
2.指標決定了加減所走的距離。
int main()
{
int arr[10] = { 0 };
int *p = arr;
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + 1) = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", i);
}
return 0;
}
arr陣列中含有十個整型的空間,總共有40個位元組,由於是Int型別的指標,每+1訪問4個位元組的空間,所以利用for迴圈可以填滿arr陣列。列印結果如下
int main()
{
int arr[10] = { 0 };
char*pc = arr;
int i = 0;
for (i = 0; i < 40; i++)
{
*(pc + i) = 'x';
}
return 0
}
當我們用字元型的指標訪問時,一個Char型別訪問一個位元組的內容,當我們填滿arr時,需要40次迴圈填滿。
概念: 野指標就是指標指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)
1.指標指向的空間釋放
int *test()
{
int a = 10;
return &a;
}
int main()
{
int *p = test();
printf("%d\n", *p);
return 0;
}
這個test函式傳回來的地址沒有意義,因為a是我們建立的臨時變數,一旦脫離就消失了,所以這個p得到的地址指向的空間已經釋放,稱之為野指標。
2.指標越界訪問
這個就是我們平常的陣列,因為下標從0開始,所以定義陣列的時候,個數所在的位置不能使用,稱為越界。
3.指標的初始化
#include <stdio.h>
int main()
{
int *p;//區域性變數指標未初始化,預設為隨機值
*p = 20;
return 0;
}
如果這樣寫是錯誤的,不能這樣寫。
指標的有效性
由於空指標不能訪問,所以在每次使用之前我們要保證指標不等於空指標的時候再訪問它,檢查指標的有效性。