一、指針
所謂指針,就是一個特殊的變量,它裏面存儲的數值被解釋成爲內存裏的一個地址。這裏介紹一小部分;
首先,介紹聲名指針變量:
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]);
}
}
運行結果如下:可以看到還是很耗時間的。
四、更多
參見更多指針的詳細用法及問題說明請見: C語言指針詳解(經典,非常詳細)