標籤:數組 函數調用 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語言指標