c語言提供的指針能夠對內存直接進行操作,就像另一種操作位運算一樣,可以大大提高程序的運行效率。現在歸納總結幾點以便日後看。
1.指針是用來存放對象地址的變量,而地址是指針常量,不能進行賦值等對於變量的運算。
eg.使用指針方式將兩個數按先小後大的順序輸出
#include <stdio.h>
int main()
{
int a, b,*p1, *p2, *p;
p1 = &a, p2 = &b;
scanf("%d%d",&a, &b);
if(*p1>*p2)
{
p= p1;
p1= p2;
p2 = p;
}
printf("a=%d b=%d\n",a, b);
printf("Min is:%d Max is:%d\n",*p1, *p2);
return 0;
}
2.關於指針的運算
int a=100,*p=&a;
①(*p)++:等價於a++,運算執行後p值不變;
②*p++:按照運算符優先級,等價於*(p++),運算後表達式的值爲a,p指向下一個int型內存單元:
③*++p:按照運算符優先級,等價於*(++p),p先指向下一個int型單元,表達式再引用這個內存單元的值;
④兩指針的相減運算:設p1, p2是同一個指向類型的兩個指針(常量或變量),則p2-p1的結果爲兩個指針之間對象的個數;
3.指針與一維數組:
eg.用多種方法遍歷一維數組元素
這是地址引用法
#include <stdio.h>
int main()
{
int a[10], i;
for(i=0;i<10;i++)
scanf("%d",a+i);
for(i=0;i<10;i++)
printf("%d ",*(a+i));
return 0;
}
下面通過指向數組的指針變量簡介訪問元素
#include <stdio.h>
int main()
{
int a[10], *p;
for(p=a;p<a+10;p++)
scanf("%d",p);
for(p=a;p<a+10;p++)
printf("%d ",*p);
return 0;
}
後者比前者方法快,因爲指針變量直接指向數組元素,不必每次重新計算元素地址。類似於p++的自增運算快於加法運算,大大提高了數組元素的訪問效率。
4.指向多維數組元素的指針。
本質上,c語言將多維數組當成一維數組來處理。
1>地址辨析
在二維數組a[i][j]中,a[i]和*(a + i)是等價的,代表第i行元素的首地址;
&a[i]和a+i是等價的,代表第i行的地址;
a[i] 和*(a + i)不一定是元素,這個結論可推廣到N爲數組的情況。
2> int a[N][M], *p = &a[0][0]
訪問一個二維數組元素a[i][j],可以用:
①數組下標法 a[i][j];
②指針下標法 p[i*M+j];
③地址引用法 *(*(a+i)+j)或*(a[i] + j)
④指針引用法 *(p +i*M+j);
eg.通過指針遍歷二維數組
#include <stdio.h>
int main()
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12},*p;
for(p =a[0];p<a[0]+12;p++)
{
printf("%2d ",*p);
if((p-a[0])%4== 3)
printf("\n");//每行輸出四個元素後換行
}
return 0;
}
聲明如下:
int a[3][4], (*p2)[4];
p2=a;//p2指向一個有四個整型元素的一維數組。
eg.通過指向一維數組的指針遍歷二維數組的值
#include <stdio.h>
int main()
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4]=a;
for(int i=0;i<3;i++)
{for(int j=0;j<4;j++)
printf("%2d",p[i][j]);
printf("\n");}
return 0;
}
6.指向字符數串組的指針
1>%s輸出時參數必須爲字符串地址。
2>使用字符指針數組,各個字符串按實際長度存儲,指針數組元素只是各個字符串的首地址,不存在浪費內存單元問題。
①
給定一個整數num,( 1<=num<=3999),將整數轉換成羅馬數字。
如1,2,3,4,5對應的羅馬數字分別位I,II,III,IV,V等。
格式:
第一行輸入一個整數,接下來輸出對應的羅馬數字。
提示:
羅馬數字的常識見此鏈接,對做題有幫助哦~尤其是表示方法。
http://baike.baidu.com/link?url=injU8M4bAoc2zRZQ1GtgrfvuzCJO9PLnq6fpQGJLenakbzo-rS8p-qsYHR_81-aN
樣例輸入
123
樣例輸出
CXXIII
#include <stdio.h>
void trans_toRoman(int num)
{
char *roman[][10]={"","I","II","III","IV","V","VI","VII","VIII","IX",
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
"","M","MM","MMM"};
int i=10000,j=0,n;
for(j=0;j<4;j++)
{
n=(num%i)/(i/10);
i/=10;
printf("%s",roman[3-j][n]);
}
printf("\n");
}
int main()
{
int n;
char* roman;
scanf("%d", &n);
if(n < 1 || n > 3999)
{
printf("ERROR NUMBER!\n");
}
trans_toRoman(n);
return 0;
}
②給出一個數字,打出相應星期的英文
#include<stdio.h>
char *day_name(int n){
char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return ((n<1||n>7) ? name[0] : name[n]);
}
int main(){
int i;
scanf("%d",&i);
printf("Day No:%2d-->%s\n",i,day_name(i));
return 0;
}
先到這裏,指針的東西還很多,日後再續!