1. 程式人生 > >C語言基礎 指標的作用

C語言基礎 指標的作用

---------------start reading--------------

前言 對於一個C語言新手,許多人會有困惑,我們為什麼要用指標,直接用變數定義不是更方便嗎?那麼今天就讓我們來認識一下指標的作用,你便知道指標是多麼的不可或缺了。

首先讓我們來了解一下指標的大小 指標的大小依據平臺來決定可能是4個位元組,可能是8個位元組 X86中指標是32個位元組,X64中指標是64個位元組

接下來讓我們來看一個示例,感受一下指標的必要性

這是一個交換函式

#include<stdio.h>

void Exchange(int a ,int b)
{
	int tmp;
	tmp=b;
	b=a;
	a=tmp;
}

int main()
{
	int m=10;
	int n=20;

	Exchange(m,n);
	printf("%d,%d \n",m,n);

	return 0;
}

但他的執行結果卻沒有交換 在這裡插入圖片描述 這說明功能函式並沒有起到交換的功能

讓我們來剖析一下編譯器內部的操作情況

在這裡插入圖片描述

編譯器傳參給功能函式,功能函式中的數字交換卻沒有影響到主函式,這就給我們造成了一種假象,事實上函式的功能並沒有實現。要想實現這個函式的功能,我們要引用指標

#include<stdio.h>

void Exchange(int *p1 ,int *p2)
{
	int *tmp=p1;
	p1=p2;
	p2=tmp;
}

int main()
{
	int m=10;
	int n=20;

	Exchange(&m,&n);
	printf("%d,%d \n",m,n);

	return 0;
}

編譯結果仍然為10,20。這是因為功能函式只交換了p1p2的地址並沒有交換裡面的內容,編譯器執行狀況如圖

在這裡插入圖片描述

再來看一個功能函式

void Exchange(int *p1 ,int *p2)
{
	int *tmp=*p1;
	*p1=*p2;
	*p2=*tmp;
}

這個程式碼不能通過編譯,因為int *tmp=*p 沒有初始化,沒有給*tmp地址,我們稱這種指標為野指標,懸掛指標,沒有地址訪問權。

那麼想要實現交換函式應該怎樣做才正確呢? 這裡,我們就要提到指標的作用:解決父函式,子函式的值傳遞 子函式的改變,能夠影響父函式,一定要傳遞指標(地址)和解引用,兩個條件缺一不可

正確的方法來啦

void Exchange(int *p1 ,int *p2)
{
	int tmp;
	tmp=*p1;
	*p1=*p2;
	*p2=tmp;
}

交換結果為20,10

小結:

  1. 指標作用:解決父函式子函式的值傳遞問題
  2. 進行值傳遞必須要有傳遞指標和解引用兩個步驟,缺一不可
  3. 傳遞時實參為地址,要用&。

---------------end---------------