首頁 > 軟體

C語言清楚瞭解指標的使用

2022-06-23 14:01:57

前言

經過了指標的初步學習,我們瞭解了指標有以下特點:

1. 指標就是個變數,用來存放地址,地址唯一標識一塊記憶體空間。

2. 指標的大小是固定的4/8個位元組(32位元平臺/64位元平臺)。

3. 指標是有型別,指標的型別決定了指標的+-整數的步長,指標解除參照操作的時候的許可權。

4. 指標的運算。

今天將要從各種不同的指標的角度切入,使得我們對指標的瞭解更加深入。

字元指標

我們現在已經學會下面的這種指標的使用了:

int main()
{
	char ch = 'w';
	char* pc = &ch;
	*pc = 'w';
	return 0;
}

通過這段程式碼,把字元變數ch的地址賦給了pc,同時pc的型別是char*。

接下來讓我們來看一看另一段程式碼:

int main()
{
const char* pstr = "hello bit.";//這裡是把一個字串放到pstr指標變數裡了嗎?
printf("%sn", pstr);
return 0;
}

我們看到,這裡是把一個字串常數和指標pstr關聯起來了。並且無論有沒有加const,常數的內容是不能改變的。

int main()
{
	char* pstr = "hello bit.";//這裡是把一個字串放到pstr指標變數裡了嗎?
	*pstr = 'w';
	printf("%sn", pstr);
	return 0;
}

當我們如上圖程式碼一樣,試圖改變常數字串時就會報錯:

讓我們來通過下面的程式碼瞭解內部的邏輯:

int main()
{
char str1[] = "hello world.";
char str2[] = "hello world.";
const char *str3 = "hello world.";
const char *str4 = "hello world.";
if(str1 ==str2)
printf("str1 and str2 are samen");
else
printf("str1 and str2 are not samen");
if(str3 ==str4)
printf("str3 and str4 are samen");
else
printf("str3 and str4 are not samen");
return 0;
}

根據程式碼和執行結果,我們可以知道指標指向的常數字串的地址是相同的,但把字串賦予陣列時,地址不同,讓我們用圖來描述這個過程。

同時str1,str2,str3,str4,指的都是字串首字元的地址。

指標陣列

指標陣列的本質是陣列,只是在陣列中存放的內容是指標變數。

接下來讓我們看看指標陣列長什麼樣:

int* arr1[10]; //整形指標的陣列
char *arr2[4]; //一級字元指標的陣列
char **arr3[5];//二級字元指標的陣列

指標陣列可以類比普通陣列,比如:

我們可以發現,指標陣列和普通陣列的區別僅僅是陣列中儲存的元素型別不一樣,所以說指標陣列本質上還是陣列。

陣列指標

說完了指標陣列,讓我們來了解一下陣列指標 ,陣列指標本質上是一個指標。接下來讓我們類比一下陣列指標和我們常見的指標:

讓我們通過一段程式碼來深入瞭解 陣列指標的特點:

int main()
{
	int arr[10] = { 0 };
	printf("arr = %pn", arr);
	printf("&arr= %pn", &arr);
	printf("arr+1 = %pn", arr + 1);
	printf("&arr+1= %pn", &arr + 1);
	return 0;
}

通過學習我們知道arr是陣列首元素的地址,&arr是整個陣列的地址,可類比為普通指標和陣列指標。

函數指標

函數指標就是存放函數地址的指標 ,通過函數指標可以呼叫相應的函數。

void test()
{
printf("hehen");
}
int main()
{
printf("%pn", test);
printf("%pn", &test);
return 0;
}

通過這段程式碼我們瞭解到,函數是有地址的,那怎麼把這個地址賦予指標呢?

void test()
{
	printf("hehen");
}
int main()
{
	printf("%pn", test);
	printf("%pn", &test);
	void (*p)() = test;
	(*p)();
	return 0;
}

以上程式碼讓我們知道了,函數是可以通過指標呼叫的。

到此這篇關於C語言清楚瞭解指標的使用的文章就介紹到這了,更多相關C語言指標內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com