1. 程式人生 > 其它 >初識指標中的易混淆點

初識指標中的易混淆點

技術標籤:c++c語言指標資料結構

探討的問題

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次迴圈填滿。

2.野指標
概念: 野指標就是指標指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)
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;
}

如果這樣寫是錯誤的,不能這樣寫。
指標的有效性
由於空指標不能訪問,所以在每次使用之前我們要保證指標不等於空指標的時候再訪問它,檢查指標的有效性。