C語言指標

來源:互聯網
上載者:User

標籤:數組   函數調用   csdn   ansi   int   簡單   數組名   一個   structure   

C語言指標

      指標是什嗎?

 

指標也是一個變數,但是這個變數儲存的是一個地址,指向一個儲存單元。我們可以根據指標(地址)找到他所指的變數,並對這個變數進行操作(賦值等)。通過C裡面的取地址符號&和取所指內容的符號*可以很方便的表示指標以及指標所指的變數之間的關係

 

/* ============================================================================ Name    C語言指標 : text.c Author      :  Version     : Copyright   : Your copyright notice Description : Hello World in C, Ansi-style ============================================================================ */#include <stdio.h>#include <stdlib.h>int main(void){int array[10] = {1,2,3};//定義數組int *p = array;      //取地址int *p2 = &array;     //取地址int *p3 = &array[0];    //取地址//三種指標效果相同printf("%d\n%d\n%d\n",p,p2,p3);//指標運算  需要根據指標的類型來運算int *p4 = (array+1);    //加1,單片機和電腦不一樣,單片機加2,電腦是加4的。printf("%d\n",p4);int *p5 = (array+2);printf("%d\n",p5);printf("-----------\n");double dd[10] = {1,2,3,4,5,6,7,8,9,10};printf("%d\n",dd);printf("%d\n",dd+1);    //地址加8printf("%d\n",dd+2);}

 

 運行結果:

二.為什麼要用指標

“正確而靈活的應用的指標,可以有效表示複雜的資料結構;能夠動態分配記憶體;方便的使用字串;有效而方便的使用數組;在調用函數時獲得一個以上結果;能直接處理記憶體單元地址等”

以上的概括應該算是比較完整的,但是對於初學C的人可能又會理解起來很抽象(可能都理解不了什麼是資料結構);我們嘗試從最簡單的-----“在調用函數時獲得一個以上結果”來看看指標的作用。

 

1》值傳遞:C中在函數調用時始終採取“值傳遞”的方式。意思是這樣的:並不是實參直接參与了函數(參加了函數內的各類操作),只是實參把他的值傳遞給形參去參與函數,完成函數內的操作(函數調用時形參被分配了記憶體,形參的值是實參的拷貝;但要明白,形參和實參不是一個變數,不佔用相同的記憶體,形參發生變化了實參不一定變化。就好比三個變數a,b,c執行了步驟:b=a;b=c後,a不一定等於c)

    例1:請看下面的代碼。代碼是要實現兩個數(a,b)的交換,於是構造了交換函數swap;但是能完成目的嗎

 

/* ============================================================================ Name        : ww.c Author      :  Version     : Copyright   : Your copyright notice Description : Hello World in C, Ansi-style ============================================================================ */#include <stdio.h>#include <stdlib.h>void swap(int x,int y){int temp;temp=x;x=y;y=temp;}int main(){int a,b;a=1;b=0;swap(a,b);printf("%d %d",a,b);}

 

 運行結果:

 

 

二:多維陣列的情況。

 

這裡,讀者首先有個意識,多維陣列每一維也都是一維數組。假設有個二維數組a[3][4],那麼a[0],a[1],a[2]都是一個一維數組(他們是數組名,也是地址)。於是你能較為抽象的理解一下幾個表示方法。

 

a                                   二維數組名,指向一維數組a[0],0行首地址

 

a+1, &a[1]                     一行首地址

 

*(a+1), a[1]                   一行零列元素地址

 

*(a+1)+2,a[1]+2             一行二列元素地址

 

*(*(a+1)+2), *(a[1]+2)    一行二列元素的值

 

上面這幾個表示形式一定要注意,尤其是:a+1表示一行首地址,*(a+1)表示

 

一行零列元素地址,雖然他們的值時相同的,但是他們是不同的,a+1+1表示二行首地址,而*(a+1)+1表示一行一列元素的地址。

/*
============================================================================
Name : ww.c
Author :
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/

 

#include <stdio.h>

 

void main(){
int a[2][3]={1,2,3,4,5,6};
int *p=a[0];

 

for(;p<a[0]+6;p++)

 

printf("%d\n",*p);
}

結果:

 

 

 

 

 

 

 

 

 

    

C語言指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.