内存中的每个字节都有一个数字. 此号码称为地址.
1 scanf(“%d”,&a);
首先c 语言 指针,将a的地址提供给scanf函数,然后该函数首先保存a的地址,然后从键盘接收数据并将其通过所存储的a的地址保存到a变量中.
指针存储地址:
1个int * i_pointer; 2 i_pointer =&i; 3 //假设i的地址为0x001,则0_001存储在i_pointer中.
*称为值运算符; &称为地址运算符
指针和指针变量: 变量的地址称为指针c 语言 指针,而c语言中的一些特殊变量专门存储变量的地址,这些变量称为指针变量.
1 int i=2000; //定义一个变量
2 int *i_pointer;//定义一个指针变量 这里的*表示i_pointer是一个指针变量
3 i_pointer=&i;//&i是将i的地址赋值给指针变量i_pointer
4 printf("%d\n",*i_pointer);//输出值为2000,这里的*表示指针,即可以通过指针变量里面i的地址取到i变量的值
示例分析:
1 #include
2 #include
3 intmain()4 {5 int a,b; //定义两个变量a,b
6 int *i_pointer1,*i_pointer2;//定义两个指针变量i_pointer1,i_pointer2
7 a=100;8 b=10; //给a b 变量分别赋值
9 i_pointer1=&a;10 i_pointer2=&b;//将a和b变量的地址分别赋值给两个指针变量
11 printf("%d,%d\n",a,b);//输出a,b的值
12 printf("%d,%d\n",*i_pointer1,*i_pointer2);//通过指针找到指针变量中的a和b的地址然后得到值
13 return 0;14 }
如下:
示例问题:
一个:
1 #include
2 #include
3 intmain()4 {5 //输入a和b两个整数,按照先大后小的顺序输出
6
7 int *p1,*p2,*p,a,b; //定义三个指针变量和两个变量
8 scanf("%d,%d",&a,&b);//从键盘输入两个数并进行接收,加地址符是为了改变a和b的值
9 p1=&a;//将a的地址值赋值给指针变量p1
10 p2=&b;//将b的地址值赋值给指针变量p2
11 if(a
12 p=p1;13 p1=p2;14 p2=p;//进行交换如果a
15 }16 printf("a=%d,b=%d\n",a,b);//输出a和b的值
17 printf("max=%d,min=%d\n",*p1,*p2);//通过指针找到指针变量里面存储的地址然后取值,输出最大最小值
18 return 0;19 }
然后在上方拆分比较函数并传递指针;
1 #include
2 #include
3 intmain()4 {5 //输入a和b两个整数,按照先大后小的顺序输出
6 void max(int *p1,int *p2);7 int *p1,*p2,a,b; //定义三个指针变量和两个变量
8 scanf("%d,%d",&a,&b);//从键盘输入两个数并进行接收,加地址符是为了改变a和b的值
9
10 p1=&a;//将a的地址值赋值给指针变量p1
11 p2=&b;//将b的地址值赋值给指针变量p2
12 if(a
13 max(p1,p2);//传递的参数为指针变量
14 }15 printf("a=%d,b=%d\n",a,b);//输出a和b的值
16 printf("max=%d,min=%d\n",*p1,*p2);//通过指针找到指针变量里面存储的地址然后取值,输出最大最小值
17 return 0;18 }19 void max(int *p1,int *p2){ //p1为指针变量 加*则指向变量
20 intp;21 p=*p1;//p=a
22 *p1=*p2;//a=b
23 *p2=p;//b=p
24 }
两个: 输入三个数字:
1 #include
2 #include
3 intmain()4 {5 //输入a和b和c三个整数,按照先大后小的顺序输出
6 void max(int *p1,int *p2);7 int *p1,*p2,*p3,a,b,c; //定义三个指针变量和两个变量
8 scanf("%d,%d,%d",&a,&b,&c);//从键盘输入两个数并进行接收,加地址符是为了改变a和b的值
9
10 p1=&a;//将a的地址值赋值给指针变量p1
11 p2=&b;//将b的地址值赋值给指针变量p2
12 p3=&c;//将c的地址值赋值给指针变量p3
13 if(a
14 max(p1,p2);//传递的参数为指针变量
15 }16 if(a
24 return 0;25 }26 void max(int *p1,int *p2){ //p1为指针变量 加*则指向变量
27 intp;28 p=*p1;//p=a
29 *p1=*p2;//a=b
30 *p2=p;//b=p
31 }
指针和数组:
1 int a[10]; //定义一个一维数组2 int *p;//定义一个指针3 p=&a[0];//将数组中第0个元素的地址赋值给指针,注意p=a等同于p=&a[0]
如图所示:
================================================ ==== ============================================== ==== ============================================== ==== =
定义数组并以三种方式输出数组中的元素:
1 #include
2 #include
3 intmain()4 {5 //定义一个数组,按照下标法输出
6 int i,a[10];7 printf("请输入十个数:\n");8 for(i=0;i<10;i++){9 scanf("%d",&a[i]);10 }11 //通过下标输出
12 for(i=0;i<10;i++){13 printf("%d",a[i]);14 }15 //通过计算数组元素的地址找到元素
16 for(i=0;i<10;i++){17 printf("%d",*(a+i));//&a[i]可以用(a+i)表示
18 }19 return 0;20 }
1 #include
2 #include
3 intmain()4 {5 //定义一个数组,按照下标法输出
6 int i,a[10],*p;7 printf("请输入十个数:\n");8 for(i=0;i<10;i++){9 scanf("%d",&a[i]);10 }11 //指针变量指向数组元素
12 for(p=a;p
13 printf("%d",*p);//14 }15 return 0;16 }
指针和二维数组:
1 //输入指定的行号和列号输出对应的值
2 #include
3 #include
4 intmain()5 {6 int (*p)[3];//定义一个二维数组的指针
7 inti,j;8 int a[2][3]={{1,2,3},{4,5,6}};9 p=a;//指针指向首地址
10 printf("请输入行号:\n");11 scanf("%d",&i);12 while(i>=2){13 printf("请重新输入行号,输入值不合法。");14 }15 printf("请输入列号:\n");16 scanf("%d",&j);17 while(j>=3){18 printf("请重新输入列号,输入值不合法。");19 }20 printf("\n");21 printf("a[%d][%d]=%d\n",i,j,*(a[i]+j));22 return 0;23 }
指向函数的指针变量:
1 #include
2 #include
3 #if(0)
4 intmain()5 {6 int max(int,int);7 inta,b,c;8 printf("请输入a和b:");9 scanf("%d,%d",&a,&b);10 c=max(a,b);11 printf("max=%d\n",c);12 return 0;13 }14 int max(int x,inty){15 intz;16 if(x>y){17 z=x;18 }else{19 z=y;20 }21 returnz;22 }23 #endif
24
25 #if(1)
26 intmain()27 {28 int max(int,int);29 int (*p)(int,int);//定义一个指向函数的指针
30 inta,b,c;31 p=max;//指针变量p指向函数,将函数的入口地址赋值给指针变量
32 printf("请输入a和b:");33 scanf("%d,%d",&a,&b);34 c=(*p)(a,b);//通过指针变量调用函数
35 printf("max=%d\n",c);36 return 0;37 }38 int max(int x,inty){39 intz;40 if(x>y){41 z=x;42 }else{43 z=y;44 }45 returnz;46 }47 #endif
使用指向函数的指针作为函数参数:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-243037-1.html