指针
指针简介
变量形式:数据类型*变量名;
注意事项:
1.在定义指定变量时,起到标志性的作用,除此之外,所有指针变量前加*,表示指针指向的内存
2.*指针变量:可以作左值也可以作右值
3.*指针变量:本质就是解引用,访问从保存的地址开始,n个连续的内存
4.指针变量要与保存地址类型匹配,否则保存地址不报警,但输出值错误
不要出现野指针,如果指针不知道指向哪里,可以指向NULL
gdb调试常用指令
编译:gcc xx.c -o xx -g
执行:gdb ./xx
gdb内部指令:r:运行;b 行号/函数名:打断点; n:单步调试; p 变量名:打印变量数据; q:退出gdb;l:查看代码
二级指针
一级指针变量保存普通变量的地址
二级指针变量保存一级指针变量的地址
指针自增
指针自增的方式访问数组每个元素,指针的指向发生改变
通过指针加上一个整数的方式访问数组的每个元素,指向没发生改变
指针和下标的组合访问数组的每个元素等价于*(p+i)
数组指针
本质是一个指针变量,保存数组的起始地址
语法:每个元素的类型(*p)[元素个数],
例:int(*p)【8】:表示p是一个指针变量,保存8个元素,每个元素是整型的数组的起始地址
一维数组指针
//p:保存的是数组的起始地址
//p+1:偏移一个数组大小
//*p:表示数组首元素的起始地址
//*p+i:表示数组的起始地址
二维数组指针
p:是一个数组指针,保存二维数组第一行的起始地址
p+i:第i+1行的起始地址
*(p+i):每一行第一个元素的起始地址
*(p+i)+j:每一行每一个元素的起始地址
*( *p+i)+j):每一行的每一个元素
指针数组:本质就是一个数组,每个元素都是指针类型
函数
内置函数:既终端自带的 函数库,需要用到时可以参考函数手册
函数定义
例:#include <stdio.h>double add_function(int , double ); //函数声明:提前告诉编译器函数的类型 double sub_function(int x, double y){ double result ; result = x-y; return result; } int main() //主函数 调用函数 { int a = 1; double b = 2.5; double ret; // ret = add_function(a, b); //函数调用 , a,b 实参 ret = sub_function(a, b); printf("ret = %.2lf\n",ret); return 0;} //函数定义: 具体实现某个功能的步骤 x, y是形参 double add_function(int x, double y) //子函数 被调用函数 { double result; result = x+y; return result;}
函数嵌套:不可无限嵌套,会导致栈越界
递归函数
#include int factorial(int a) { if (a == 1) return 1; else { a = a * factorial(a-1); return a; } } int main() { int ret; ret = factorial(5); printf("ret = %d\n", ret); return 0; }
@被下列文档引用 · 0