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]);

       运行结果

    






原文地址:https://www.cnblogs.com/sunnybowen/p/8628970.html