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; }
运行结果:
5 数组和指针(这个程序背下!!!):数组名作为右值的时候,就是第一个元素的地址。
#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]);
运行结果