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;
}
先到这里,指针的东西还很多,日后再续!