學習筆記-C語言6(指標與動態記憶體分配)
1. 指標
指標的引入:
指標是C語言最強大的功能之一,使用指標可以儲存某個變數在記憶體中的地址,並且通過操作指標來對該片記憶體進行靈活的操作,例如改變原變數的值,或者構造複雜的資料結構。指標一般初始化為NULL(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。
實現程式碼: