zoukankan      html  css  js  c++  java
  • 180323

    1  函数与指针  ,看下面的程序,调用函数add后,其实只是capy了一份给函数调用,并没有改变main函数里的值,回去看看自己之前写的代码,看看是怎么写的!没有用指针函数值为啥也变了!!!C语言中,实参传递给形参,是按值传递的,也就是说,函数中的形参是实参的拷贝份,形参和实参只是在值上面一样,而不是同一个内存数据对象。这就意味着:这种数据传递是单向的,即从调用者传递给被调函数,而被调函数无法修改传递的参数达到回传的效果。

    #include<stdio.h>
    int add(int a);
    int main(void){ 
      int a=5;
      add(a);
      printf("a=%d  
    ",a);
    }
    int add(int a){
        a++;
        return a;
    } 

       运行结果如下:

     

      那么,要想改变函数中的值,应该怎么做呢?利用指针!

    #include<stdio.h>
    int add(int *pa);
    int main(void){ 
      int a=5;
      add(&a);
      printf("a=%d  
    ",a);
    }
    int add(int *pa){
        (*pa)++;//这里要加(),否则a还是5! 
        return *pa;
    } 

    运行结果如下:


    2    sizeof 与指针:当对数组名使用sizeof时,返回的是整个数组占用的内存字节数。当把数组名赋值给一个指针后,再对指针使用sizeof运算符,返回的是指针的大小。这就是为什么将一个数组传递给一个函数时,需要另外用一个参数传递数组元素个数的原因了。

    #include<stdio.h>
    int main(void){ 
      int arr[3]={1,2,3};
      int *p=arr;
      printf("sizeof(arr)=%d
    ",sizeof(arr));
      printf("sizeof(p)=%d
    ",sizeof(p));
    }

     结果:
      


    3  指针的自增自减运算:指向数组元素的指针 支持 递增 递减 运算。(实质上所有指针都支持递增递减 运算 ,但只有在数组中使用才是有意义的)

    #include<stdio.h>
    int main(void){ 
      int arr[3]={1,2,3};
      int *p=arr;
      for(;p!=arr+3;p++){
          printf("%d
    ",*p);    
      }
    }

     输出结果:

     


    4    结构体和指针(这个程序要背下来!!!) 关于结构体是如何在内存中存储的,大纲不做要求的话可以不看,要会用就行了!!!!!

         结构体指针有特殊的语法:  -> 符号 
         如果p是一个结构体指针,则可以使用 p ->【成员】 的方法访问结构体的成员
    #include<stdio.h>
    typedef struct{
        char name[31];
        int age;
        float score;
    } Stu;
    int main(void){ 
      Stu stu = {"Bob",19,98.0};
      Stu *ps=&stu;
      
      ps->age=20;
      ps->score=99.0;
      printf("name:%s age:%d
    ",ps->name,ps->age);
      return;
    }

     运行结果:

      


    数组和指针(这个程序背下!!!):数组名作为右值的时候,就是第一个元素的地址。

    #include<stdio.h>
    int main(void){ 
      int arr[3]={3,2,1};
      int *pa = arr;
      printf("%d
    ",*pa);
    }

    运行结果:

     


    6   函数指针

         每一个函数本身也是一种程序数据,一个函数包含了多条执行语句,它被编译后,实质上是多条机器指令的合集。在程序载入到内存后,函数的机器指令存放在一个特定的逻辑区域:代码区。既然是存放在内存中,那么函数也是有自己的指针的。
         C语言中,函数名作为右值时,就是这个函数的指针。
    #include<stdio.h>
    void echo(const char *msg){
        printf("%s",msg);
    } 
    int main(void){
        void (*p)(const char*)=echo;//函数指针变量指echo向这个函数 
        p("hello ");//通过指针调p用这个函数 ,等价于echo(“hello”) 
        echo("world
    "); 
    }

            运行结果:

           


    7    %s   输入出字符串
    #include<stdio.h>
    int main(void){
        char ch[10];
        scanf("%s",&ch);
        printf("%s",ch);//=printf(ch);
    }

          补充:输入/输出格式

    %d 十进制有符号整数 
    %u 十进制无符号整数
    %f 浮点数
    %s 字符串
    %c 单个字符
    %p 指针的值
    %e 指数形式的浮点数
    %x, %X 无符号以十六进制表示的整数
    %0 无符号以八进制表示的整数
    %g 自动选择合适的表示法


    8   数组长度及打印
    int main(void){
        int a;
        char s[12]="hello bowen";   
        printf("%p
    ",&s[1888]);
        printf("%c
    ",s[1888]);

           运行结果

        






  • 相关阅读:
    梯度算法之梯度上升和梯度下降
    如何用hexo+github搭建个人博客
    《机器学习实战-KNN》—如何在cmd命令提示符下运行numpy和matplotlib
    Python的operator.itemgetter函数和sorted函数
    源代码中直接package edu.princeton.cs.algs4还是import edu.princeton.cs.algs4问题
    关于在windows命令提示符cmd下运行Java程序的问题
    Windows10下用Anaconda3安装TensorFlow教程
    如何理解假设空间与版本空间?
    在windows64位Anaconda3环境下安装XGBoost
    用FastDFS一步步搭建图片服务器(单机版)
  • 原文地址:https://www.cnblogs.com/sunnybowen/p/8628970.html
Copyright © 2011-2022 走看看