C语言之指针

内存中每一个字节都有一个编号,这个编号叫做地址。

 1 scanf("%d",&a); 

首先,将a的地址给scanf函数,然后函数先把a的地址保存起来,然后从键盘接收数据通过存储的a的地址保存到a变量中。

指针是存放地址的:

 1 int *i_pointer; 2 i_pointer=&i; 3 //假设i的地址为0x001,则i_pointer中存放的是0x001。 

* 叫做取值操作符;& 叫做取址操作符

指针和指针变量:把一个变量的地址称为指针,c语言中的一些特殊的变量专门存放变量的地址称这些变量称为指针变量。

1 int i=2000; //定义一个变量
2 int *i_pointer;//定义一个指针变量 这里的*表示i_pointer是一个指针变量
3 i_pointer=&i;//&i是将i的地址赋值给指针变量i_pointer
4 printf("%d
",*i_pointer);//输出值为2000,这里的*表示指针,即可以通过指针变量里面i的地址取到i变量的值

举例分析:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int main()
 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
",a,b);//输出a,b的值
12     printf("%d,%d
",*i_pointer1,*i_pointer2);//通过指针找到指针变量中的a和b的地址然后得到值
13     return 0;
14 }

 示意图如下:

 例题:

一:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int main()
 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<b){//将a和b进行比较
12         p=p1;
13         p1=p2;
14         p2=p;//进行交换如果a<b的话,将a的地址值赋值给p2,b的地址值赋值给p1
15     }
16     printf("a=%d,b=%d
",a,b);//输出a和b的值
17     printf("max=%d,min=%d
",*p1,*p2);//通过指针找到指针变量里面存储的地址然后取值,输出最大最小值
18     return 0;
19 }

然后将上边的比较函数拆分出来,通过传入指针;

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int main()
 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<b){//将a和b进行比较
13         max(p1,p2);//传递的参数为指针变量
14     }
15     printf("a=%d,b=%d
",a,b);//输出a和b的值
16     printf("max=%d,min=%d
",*p1,*p2);//通过指针找到指针变量里面存储的地址然后取值,输出最大最小值
17     return 0;
18 }
19 void max(int *p1,int *p2){ //p1为指针变量 加*则指向变量
20     int p;
21     p=*p1;// p=a
22     *p1=*p2;//a=b
23     *p2=p;//b=p
24 }

二:输入三个数:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int main()
 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<b){//将a和b进行比较
14         max(p1,p2);//传递的参数为指针变量
15     }
16     if(a<c){
17         max(p1,p3);
18     }
19     if(b<c){
20         max(p2,p3);
21     }
22     printf("a=%d,b=%d,c=%d
",a,b,c);//输出a和b的值
23     //printf("max=%d,min=%d
",*p1,*p2);//通过指针找到指针变量里面存储的地址然后取值,输出最大最小值
24     return 0;
25 }
26 void max(int *p1,int *p2){ //p1为指针变量 加*则指向变量
27     int p;
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 <stdio.h>
 2 #include <stdlib.h>
 3 int main()
 4 {
 5     //定义一个数组,按照下标法输出
 6     int i,a[10];
 7     printf("请输入十个数:
");
 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 <stdio.h>
 2 #include <stdlib.h>
 3 int main()
 4 {
 5     //定义一个数组,按照下标法输出
 6     int i,a[10],*p;
 7     printf("请输入十个数:
");
 8     for(i=0;i<10;i++){
 9         scanf("%d",&a[i]);
10     }
11     //指针变量指向数组元素
12     for(p=a;p<(a+10);p++){ //p指向数组的首地址
13         printf("%d",*p);//
14     }
15     return 0;
16 }

 指针与二维数组:

 1 //输入指定的行号和列号输出对应的值
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 int main()
 5 {
 6     int (*p)[3];//定义一个二维数组的指针
 7     int i,j;
 8     int a[2][3]={{1,2,3},{4,5,6}};
 9     p=a;//指针指向首地址
10     printf("请输入行号:
");
11     scanf("%d",&i);
12     while(i>=2){
13         printf("请重新输入行号,输入值不合法。");
14     }
15     printf("请输入列号:
");
16     scanf("%d",&j);
17     while(j>=3){
18         printf("请重新输入列号,输入值不合法。");
19     }
20     printf("
");
21     printf("a[%d][%d]=%d
",i,j,*(a[i]+j));
22     return 0;
23 }

 指向函数的指针变量:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #if(0)
 4 int main()
 5 {
 6     int max(int,int);
 7     int a,b,c;
 8     printf("请输入a和b:");
 9     scanf("%d,%d",&a,&b);
10     c=max(a,b);
11     printf("max=%d
",c);
12     return 0;
13 }
14 int max(int x,int y){
15     int z;
16     if(x>y){
17         z=x;
18     }else{
19         z=y;
20     }
21     return z;
22 }
23 #endif
24 
25 #if(1)
26 int main()
27 {
28     int max(int,int);
29     int (*p)(int,int);//定义一个指向函数的指针
30     int a,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
",c);
36     return 0;
37 }
38 int max(int x,int y){
39     int z;
40     if(x>y){
41         z=x;
42     }else{
43         z=y;
44     }
45     return z;
46 }
47 #endif

 用指向函数的指针做函数参数:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 //用指向函数的指针做函数参数
 4 #if(1)
 5 int main()
 6 {
 7     int func(int x,int y,int (*p)(int,int));
 8     int max(int,int);
 9     int min(int,int);
10     int add(int,int);
11     int a=34,b=21,n;
12     printf("请输入1,2,3:");
13     scanf("%d",&n);
14     if(n==1) func(a,b,max);
15     else if(n==2) func(a,b,min);
16     else if(n==3) func(a,b,add);
17     return 0;
18 }
19 
20 int func(int x,int y,int (*p)(int,int)){
21     int result;
22     result=(*p)(x,y);
23     printf("%d
",result);
24     return 0;
25 }
26 int max(int x,int y){
27     int z;
28     if(x>y){
29         z=x;
30     }else{
31         z=y;
32     }
33     return z;
34 }
35 
36 int min(int x,int y){
37     int z;
38     if(x>y){
39         z=y;
40     }else{
41         z=x;
42     }
43     return z;
44 }
45 
46 int add(int x,int y){
47     int z;
48     z=x+y;
49     return z;
50 }
51 #endif
原文地址:https://www.cnblogs.com/yh2924/p/12450159.html