/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年6月26日
*版本号:v1.0
*
*问题描述:取地址运算符&,指针运算符*的使用;
*输入描述:输入一个变量,一个指针变量,对指针变量进行运算;
*程序输出:输出结果。
*/
#include<stdio.h>
int main()
{
int a=3;
int *p=&a;
int b=*p+3;
int point=&*p;
int c=*&b;
printf("%d \n",*p);
printf("%d \n",b);
printf("%d \n",point);
printf("%d \n",c);
return 0;
}
/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年6月26日
*版本号:v1.0
*
*问题描述:取地址运算符&,指针运算符*的使用;
*输入描述:输入一个变量,一个指针变量,对指针变量进行运算;
*程序输出:输出结果。
*/
#include<stdio.h>
int main()
{
int a=3;
int *p=&a;
int b1=&a;
int b2=p;
int c=*p+3;
int d=&*p;
int e=*&p;
int f0=*(p+0);
int f1=*(p+1);
int f2=*(p+2);
int f3=*(p+3);
int f4=*(p+4);
int f5=*(p+5);
int f00=&*(p+0);
int f11=&*(p+1);
int f22=&*(p+2);
int f33=&*(p+3);
int f44=&*(p+4);
int f55=&*(p+5);
int h0=(p+0);
int h1=(p+1);
int h2=(p+2);
int h3=(p+3);
int h4=(p+4);
int h5=(p+5);
printf("*p=&a:%d \n",*p);
printf("b1=&a:%d \n",b1);
printf("b2=p:%d \n",b2);
printf("c=*p+3:%d \n",c);
printf("d=&*p:%d \n",d);
printf("e=*&p:%d \n",e);
printf("f0=*(p+0):%d \n",f0);
printf("f1=*(p+1):%d \n",f1);
printf("f2=*(p+2):%d \n",f2);
printf("f3=*(p+3):%d \n",f3);
printf("f4=*(p+4):%d \n",f4);
printf("f5=*(p+5):%d \n",f5);
printf("f00=&*(p+0):%d \n",f0);
printf("f11=&*(p+1):%d \n",f1);
printf("f22=&*(p+2):%d \n",f2);
printf("f33=&*(p+3):%d \n",f3);
printf("f44=&*(p+4):%d \n",f4);
printf("f55=&*(p+5):%d \n",f5);
printf("h0=*&(p+0):%d \n",h0);
printf("h1=*&(p+1):%d \n",h1);
printf("h2=*&(p+2):%d \n",h2);
printf("h3=*&(p+3):%d \n",h3);
printf("h4=*&(p+4):%d \n",h4);
printf("h5=*&(p+5):%d \n",h5);
return 0;
}
指针变量的类型需要与指向的变量的类型一致!
&取地址运算符
*间接访问运算符
指针变量在未定义指向某一变量时,不能直接指向某一固定的地址(不能*p=10这种操作),因为内存是严格管理的,不能随意读取,否则运行程序时会报错。
上句话的意思就是:不能对未赋值的指针变量,做指向运算!
/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年6月26日
*版本号:v1.0
*
*问题描述:利用交换指针地址,比较两个数的大小并输出;
*输入描述:输入两个数;
*程序输出:输出正确的max和min;
*备注:p1,p2的值,即其指向单元的地址被交换了,这种交换并未对a和b两个保存实型数据的单元造成影响。
*/
#include <stdio.h>
int main()
{
int a,b,*p1,*p2,*p3;
p1=&a;
p2=&b;
scanf("%d %d",&a,&b);
if(a<b)
{
p3=p1;
p1=p2;
p2=p3; //交换指针
}
printf("a=%d b=%d\n",a,b);
printf("max=%d min=%d\n",*p1,*p2);
return 0;
}
以上的方法:p1,p2的值,即其指向单元的地址被交换了,这种交换并未对a和b两个保存实型数据的单元造成影响。
/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年6月26日
*版本号:v1.0
*
*问题描述:输入加法式子,并判断后输出结果;
*输入描述:输入int+int;
*程序输出:加法的结果或提示不是加法;
*/
#include <stdio.h>
int main()
{
int a,b,c;
char op;
scanf("%d%c%d",&a,&op,&b);
//scanf("%d%c%d\n",&a,&op,&b);加了个\n,则输入的时候需要多输入一个字符或数才可以
if(op=='+')
{
c=a+b;
printf("运算结果是:%d\n",c) ;
}
else
{
printf("不是加法,不运算!\n");
}
return 0;
}
为什么会有这种差异:a+0 vs 0+a识别的结果不一样!
在scanf函数中:%f代表的是float型,%lf代表double;
而在printf函数中:%f代表double型,%lf代表长双精即longdouble。
/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年6月26日
*版本号:v1.0
*
*问题描述:体验换行符在printf函数中是应用;
*输入描述:;;
*程序输出:;。
*体验"d","8d","o","8o","x","8x","X","8X"
*体验"%m.nf";m代表总位数(总宽度),n代表小数点后保留n位
*%m.nf\n,若实际整数部分小于(m-n),则整数部分按实际显示,不在最高位前补0.
*/
#include <stdio.h>
int main()
{
printf("HELLO WORLD123!\n");
printf("Welcome\nTo\nBeiJing\n!\n");
printf("%d+%d=%d\n",2,3,5);
printf("%4.2f+%6.3f=%8.4f\n",2.1,2.9,10.0);
printf("%d\n",1234);
printf("%8d\n",1234);
printf("%o\n",1234);
printf("%8o\n",1234);
printf("%x\n",1234);
printf("%8x\n",1234);
printf("%X\n",1234);
printf("%8X\n",1234);
printf("%10.7f\n",1.1);
printf("%e\n",12345.12345);
printf("%E\n",123456.123456);
return 0;
}
/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年6月26日
*版本号:v1.0
*
*问题描述:体验printf函数中("%格式描述\n,参数");
*格式描述与参数类型必须一致
*输入描述:;;
*程序输出:;。
*/
#include <stdio.h>
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=a+b;
printf("%d\n",c);
printf("%d+%d=%d\n",a,b,c);
printf("%f\n",c);
//当格式描述与参数类型不一致时,输出会放生错误。
//则报错:warning:format '%f' experts argument of type 'double',but argument 2 has type 'int'
return 0;
}