1. 程式人生 > >學習筆記-C語言6(指標與動態記憶體分配)

學習筆記-C語言6(指標與動態記憶體分配)

1. 指標

指標的引入:

指標是C語言最強大的功能之一,使用指標可以儲存某個變數在記憶體中的地址,並且通過操作指標來對該片記憶體進行靈活的操作,例如改變原變數的值,或者構造複雜的資料結構。指標一般初始化為NULL(0)。& 是取地址運算,* 是間接運算子,通過 * 可以訪問修改指標所指的變數值。

宣告指標變數:變數型別 * 變數名;獲取指標指向的變數中儲存的值: * 變數名

指向指標的指標:

儲存指標的地址的指標是指向指標的指標,使用 * 指標指向普通變數,使用 ** 指標指向 * 指標,使用 *** 指標指向 ** 指標,...

一維陣列與指標:

陣列是相同型別

的物件集合,通過陣列名稱可以索引陣列的各個元素;陣列的名稱實際上是陣列的地址,即陣列第一個元素a[0]的地址。同樣我們可以通過指標來遍歷、訪問、修改陣列中的元素值。指標向前移動時,移動的單位長度即為該指標大小。

示例程式碼:

#include <stdio.h>
int main(){
	int number[5] = {10, 20, 30, 40, 50};
	int *pointer = number;
	int i;
	printf("number = %p pointer = %p\n", number, pointer);
	printf("sizeof(number) = %d sizeof(pointer) = %d\n",
						sizeof(number), sizeof(pointer));
	printf("\n");
	for (i = 0; i < 5; i++){
		printf("number[%d]'s address = %p\n", i, &number[i]);
		printf("pointer = %p pointer's value = %d\n", pointer, *pointer);
		pointer++;
	}
	printf("\n");	
	pointer = number;
	for (i = 0; i < 5; i++){
		printf("number[%d] = %d, %d\n", i, *(pointer + i), pointer[i]);
	}	
	return 0;
}

變數是一個元素的陣列:

C語言中一切內容都與記憶體地址有關,一個元素的變數與陣列沒有本質的區別,都是使用記憶體儲存資料,我們可以將單獨的變數看做是包含一個元素的陣列。陣列下標運算子[]與取消運算子 * ,本質上實現的是相同的功能。

示例程式碼:

#include <stdio.h>

int main(){	
	int number = 0;
	int *pointer = &number;
	
	*pointer = 30;
	printf("number = %d\n", number);
	
	pointer[0] = 999;
	printf("number = %d\n", number);
	
	*&number = 100;
	printf("number = %d\n", number);
	
	(&number)[0] = 25;	//陣列下標運算優先順序更高
	printf("number = %d\n", number);
	
	return 0;
}

字串與指標:

利用指標訪問字串或者修改字串中的資料,就是使用指標訪問或者修改一維字元陣列中的資料。字串只是邏輯上的概念,要注意的是字串以字串結束符 '\0' 標記結束。通常情況下,操作字串時使用指標形式要比使用陣列形式更常見,兩者沒有本質區別。

示例程式碼:

#include <stdio.h>

void my_strcpy1(char to[], const char from[]){
	int i = 0;
	while(from[i]){
		to[i] = from[i];
		i++;
	}
	to[i] = '\0';
}

void my_strcpy2(char *to, const char *from){
	while(*from){
		*to = *from;
		to++;
		from++;
	}
	*to = '\0';
}

int main(){
	char str[10] = "123456789";
	char str2_1[20] = "123456789123456789";
	char str2_2[20] = "123456789123456789";
	my_strcpy1(str2_1, str);
	my_strcpy2(str2_2, str);
	printf("str2_1 = [%s]\n", str2_1);
	printf("str2_2 = [%s]\n", str2_2);
	return 0;
}

指標的基礎用法練習:

定義兩個證書,number1和number2,兩個指標pointer1和pointer2,使pointer1指向number1,pointer2指向number2;一個指向指標的指標p_pointer,指向pointer2。實現如下程式碼:

1)通過pointer1與p_pointer讀入資料,儲存至number1與number2;

2)通過pointer1與p_pointer將number1與number2修改為999與100;

3)通過p_pointer將pointer2的指向修改為指向number1。

實現程式碼: