一、指針的定義及基本概念
指針在C語言中具有重要的作用,它可以用來訪問和操作內存中的數據,是C語言中的一種強大的工具。指針實際上就是相應數據類型的內存地址,指針變量存儲的是數據的內存地址。下面我們來看一個簡單的示例:
#include int main() { int a = 3, b = 4; int *pointer = &a; printf("%d,%d,%d\n",*pointer,a,b); //3,3,4 *pointer = 5; printf("%d,%d,%d\n",*pointer,a,b); //5,5,4 pointer = &b; printf("%d,%d,%d",*pointer,a,b); //4,5,4 return 0; }
在上面的代碼中,我們定義了一個指向整型變量a的指針,並將其初始化為a的內存地址。之後我們打印了指針所指向的變量a的值(即3),然後我們通過指針修改了a的值,並打印了a和指針指向的值(即5)。然後我們將指針指向了變量b,再次打印指針指向的值,此時輸出的是變量b的值,即4。
二、指針的運算
指針的運算包括指針的加減、指針的比較。指針的加減通常用於指向數組中的元素,可以實現數組元素的遍歷。指針之間的比較可以用於判斷指向的地址大小關係,在排序、查找算法中有很重要的作用。下面我們來看一個示例:
#include int main() { int arr[5] = {1,2,3,4,5}; int *pointer = arr; printf("%d,%d,%d\n",*pointer,*(pointer+1),*(pointer+2)); //1,2,3 if(pointer<arr+4) printf("pointer is smaller than arr+4"); //pointer is smaller than arr+4 return 0; }
在上面的代碼中,我們定義了一個包含5個整型元素的數組,然後我們將指針指向了數組的首地址。之後我們通過指針訪問數組中的元素,輸出了前三個元素的值。最後我們比較了指針和數組最後一個元素的地址大小關係。由於指針指向的是數組的首地址,而數組名代表的是數組的首地址,因此arr+4實際上表示的是數組最後一個元素的下一個地址,所以我們判斷了指針是否小於arr+4,輸出了提示信息。
三、指針與函數
指針在函數中也扮演着重要的角色,指針參數可以讓函數直接操作傳遞的數據,同時也能將函數內部的操作結果傳遞給調用者。下面我們來看一個示例:
#include void swap(int *p1, int *p2) { int temp; temp = *p1; *p1 = *p2; *p2 = temp; } int main() { int a = 3, b = 4; printf("%d,%d\n",a,b); //3,4 swap(&a,&b); printf("%d,%d",a,b); //4,3 return 0; }
在上面的代碼中,我們定義了一個swap函數,它接受兩個整型指針參數,並通過交換兩個指針所指向的值,完成了兩個整型變量的交換。在主函數中,我們定義了兩個變量a和b,並打印了它們的值,隨後我們調用了swap函數,並傳遞了a和b的地址,完成了變量的交換。之後我們再次輸出a和b的值,可以看到它們已經交換了。
四、指向指針的指針
指向指針的指針是C語言中最複雜的概念之一,當我們定義一個指向指針的指針時,它實際上就是二級指針。指向指針的指針通常用於動態內存分配以及函數參數傳遞等場合。下面我們來看一個示例:
#include int main() { int a = 3, *p1 = &a, **p2 = &p1; printf("%d,%d,%d,%d\n",a,*p1,**p2,***p2); //3,3,3,3 ***p2 = 5; printf("%d,%d,%d,%d",a,*p1,**p2,***p2); //5,5,5,5 return 0; }
在上面的代碼中,我們定義了一個整型變量a,並定義了一個指向a的指針p1。隨後我們定義了一個指向p1的指針p2,並通過二級指針間接訪問了變量a的值。之後我們通過三級指針修改了變量a的值,並打印了變量a、指針p1、指針p2以及三級指針指向的值,可以發現它們都變成了5。
五、指針的常見誤區
指針雖然在C語言中具有重要的作用,但也有很多容易出錯的地方。下面我們舉幾個常見誤區:
1、未初始化的指針
#include int main() { int *p; printf("%d",*p); //可能輸出任意值,也可能導致程序崩潰 return 0; }
在上面的代碼中,我們定義了一個指針p,但沒有給它初始化。當我們通過指針訪問變量時,由於指針未指向有效的內存地址,可能導致程序崩潰。
2、指針類型的不匹配
#include int main() { int a = 3; float *p = &a; return 0; }
在上面的代碼中,我們定義了一個整型變量a,然後我們定義了一個浮點型指針p,並將其初始化為a的地址。由於指針類型與變量類型不匹配,編譯器會給出警告或錯誤。
3、指針的非法操作
#include int main() { int arr[5] = {1,2,3,4,5}; int *p = arr; p += 6; //非法 return 0; }
在上面的代碼中,我們定義了一個整型數組arr,然後我們定義了一個指針p,並將其初始化為數組的首地址。當我們對指針進行加減運算時,如果越界訪問數組,就會產生非法操作。
原創文章,作者:VVJW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/133534.html