1.二级指针
一级指针:存放变量的地址
二级指针:存放一级指针变量的地址
格式:
存储类型 数据类型 **指针变量名
如:
int a = 10;
int *p = &a;
int **q = &p;
访问a的值:
*p **q a
访问a的地址:
p *q &a
访问p的地址
q &p
(1)指针和数组
直接访问:通过数组名访问(按变量的地址存取变量的值)
间接访问:通过指针变量访问(存放变量的地址的变量去访问)
①指针和一维数组
如:
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
直接访问:
间接访问:
当指针变量保存了数组的首地址,指针变量就可以代替数组名完成数组操作
a和p本质上不同(但表达的意思相同)
a是地址常量,p是变量,a不能执行++、--操作,但是p可以
访问数组元素a[i]的值:
直接访问:a[i] *(a+i)
间接访问:p[i] *(p+i)
访问数组元素a[i]的地址:
直接访问:&a[i] a+i
间接访问:&p[i] p+i
(2)指针数组
本质是数组,只是数组内存放的是指针
格式:
存储类型 数据类型 *数组名[元素个数]
存储内容:
1.存放普通变量地址
int a = 10, b = 20, c = 30;
int *arr[3] = {&a, &b, &c};
访问b的地址:
arr[1] *(arr+1)
访问b的值:
*(arr[1]) *(*(arr+1))
2.存放二维数组每行的首元素地址(列地址)
int a[2][3] = {1, 2, 3, 4 ,5 ,6};
int *arr[2] = {a[0], a[1]};
访问a[1][2] 的地址
arr[1]+2 *(arr+1)+2
arr:第一行首元素的地址
arr+1:第二行的首元素的地址
*(arr+1):第二行首元素 ==> a[1]:第二行第一列的地址
*(arr+1)+2:第二行第三列的地址 &a[1][2]
3.存放字符串
char str[32] = "hello"; // 存放的是整个hello字符串
char *s = "hello"; // 存放的是hello字符串的首地址
使用指针数组存放字符串
char *s[3] = {"hello", "world", "Deadman"};
打印 "Deadman" 字符串
printf("%s\n", s[2]); // Deadman
printf("%s\n", *(s+2)) // Deadman
printf("%s\n", *(s+2)+4) // man
打印 'm' 这个字符
printf("%c\n", *(*(s+2)+4)); // m
printf("%c\n", *(s[2]+4)); // m
4.命令行参数
argv:就是一个指针数组,里面存放的是命令行传递的字符串
argc:表示argv指针数组里面存储数据的个数,即命令行传递的字符串个数
如:
2.函数
(功能、参数、返回值)(一个特定功能代码块)
(1)定义格式
存储类型 数据类型 函数名(参数列表) // 形参
{
函数体; // 函数功能
return; // 函数返回值
}
- 没有参数:参数列表可以省略,也可以使用void
- 没有返回值:函数内部没有return语句,数据类型为 void
- 有返回值:要根据返回值的数据类型定义函数的数据类型,并没有return语句
- 定义子函数时直接定义在主函数上面,如果定义在主函数下面需要提前函数声
(2)函数声明
就是对函数进行一个取名
格式:
数据类型 函数名(参数列表)
如:
void fun(); // 函数声明
int main()
{
fun();
return 0;
}
void fun()
{
内容
}