zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    JS计算日期加天数后的日期(起始日期+有效天数=截至日期)
    js取整数、取余数的方法
    js取整数、取余数的方法
    Spring注解@Component、@Repository、@Service、@Controller区别
    Spring注解@Component、@Repository、@Service、@Controller区别
    mybatis参数映射
    PHP实现单点登录最简单的方法
    php cli传递参数的方法
    采集百度搜索的方法
    PHP curl模拟ip和来源进行访问
  • 原文地址:https://www.cnblogs.com/yh2924/p/12450159.html
Copyright © 2011-2022 走看看