C語言 基礎指標簡介
阿新 • • 發佈:2019-02-16
一、指標
所謂指標,就是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。這裡介紹一小部分;
首先,介紹聲名指標變數:
int p; //一個整形數p;
int *p; //一個指標p;
int p[50]; //一個數組p,其中的所有資料均為int;
int *p[50]; //一個數組p,其中的資料型別均是指標;
這裡要注意:int p;是定義了一個整型數p;所以int *p;首先是定義了一個整型數*p;並且你所定義的指標即為p(這裡指向p的地址);
二、運算子&和*
這裡&是取地址運算子,*是間接運算子。
&a 的運算結果是一個指標,指標的型別是a 的型別加個*,指標所指向的型別是a 的型別,指標所指向的地址嘛,那就是a 的地址。
*p 的運算結果就五花八門了。總之*p 的結果是p 所指向的東西,這個東西有這些特點:它的型別是p 指向的型別,它所佔用的地址是p所指向的地址。
例如以下程式:
#include<stdio.h>
int main()
{
int a,b;
int *p;
while(scanf("%d%d",&a,&b)!=EOF)
{
p=&a;
b=*p+5;
printf("%d",b);
}
}
首先,輸入整型數a,然後,再將a的值賦給指標p,特別注意這裡一定要都是指向地址的變數才對;最後,再將b由*p+5運算得出,執行的結果就是把a的值加上5;
一個簡單的換數:
#include<stdio.h> void swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } int main() { int a,b; int *pointer1,*pointer2; while(scanf("%d%d",&a,&b)!=EOF) { pointer1=&a; pointer2=&b; if(a<b) { swap(pointer1,pointer2); } printf("%d %d\n",a,b); } }
三、指標與陣列
先看下面一個程式;
#include<stdio.h>
void main(){
int a[20];
int *p,*q;
p=&a[3];
q=&a[18];
printf("q-p=%d\n",q-p);
}
算出來執行結果了嗎?沒錯就是q-p=15,這裡的p和q分別指向的是a[3]和[18]的地址,即為p=3,q=18;在這裡a[3]和a[18]都是陣列啊中的一個整型資料,在對其取地址&a[3],&a[18],意為在給指標p、q賦值運算,延伸一下如果再對p做運算p+1,則為將p移向下一個地址,即為&a[4],而*p也就是a[4];
下面來看給一個數組逆序:
#include<stdio.h>
void invert(int *p,int n){
int i;
int temp;
for(i=0;i<=(n-1)/2;i++){
temp=*(p+i); //p+i為第i個數,
*(p+i)=*(p+n-i-1); //p+n-i-1為第n-i-1個數,與p+i位置對稱;
*(p+n-i-1)=temp; //把正數第i個數與倒數第i個數交換;
}
}
void main()
{
int a[10]={1,3,5,7,9,1,3,5,7,9};
int i,*p;
void invert();
p=a; //把陣列a賦給指標p,陣列不用取地址&;
for(i=0;i<10;i++)
{
printf("%-5d",a[i]);
}
printf("\n");
invert(p,10); //代入函式invert,代入指標p,不要加*,就像把陣列代入函式中一樣;
for(i=0;i<10;i++)
{
printf("%-5d",a[i]);
}
}
執行結果如下:可以看到還是很耗時間的。