指针与数组:
一维数组:
1. char a[10];
char *p;
p = a;//p = &a[5];
2.关系:{
a[i] = *(a+i);
a[3] = *(a+3) = p[3] = *(p+3)
数组名约等于指针,除了自增自减和赋值(数组名本质是地址常量,指针本质是地址变量)
p++ ++p --p p++ p = p+1
}
3.注意指针的当前位置
通过自增、自减、赋值可以改变指针的当前位置
}
二维数组:
二维数组由多个一维数组组成
行指针:
二维数组名加一,跳一行数据,所以二维数组又交行地址
一般形式:存储类型 数据类型 (*行指针名)[列数];
int (*p)[3] --> 表明这个指针变量+1, 跳3个数据
改变指针性质/降维:加*操作
*p+1 --> 跳一个数据
*(*p+1) -->取指针所指向变量的内容
指针数组:
区分:指针数组和数组指针:{
一般形式:
指针数组: int *p[5];
数组指针: int (*q)[5];
谁在后面本质就是什么
二级指针:{
一般形式:数据类型 ** 二级指针名;
int **p;
保存一级指针的地址叫做二级指针
const型指针:
将变量常量化
const int *p; 不能改变指针指向的数值
Int *const p = &m; 不能改变指针存的地址,初始化赋地址;
void 指针
可以存其他类型的地址,输出时强制类型转换;
函数:
定义:实现特定功能的代码模块
作用:接口重用
函数的一般形式:{
【数据类型】【函数名】(形式参数说明)
{
语句序列;
return (表达式);
}
1.数据类型:函数返回值的类型{
无返回值:void(空类型)
有返回值:基本数据类型 构造类型(struct) 地址...
注意:有返回值函数调用可以单独写一行也可以不用,无返回值时必须单独写一行
}
2.函数名:遵循标识符的命名规则
3.形式参数说明:简称形参,数据类型、变量名,有多个形参用逗号隔开
4.语句序列:又叫函数体,可以没有函数体
5.return语句:要和数据类型匹配,返回的是表达式,可以进行运算的
}
函数的说明:[数据类型][函数名](形式参数说明);
注意:函数说明时,形参名可以不写,在main函数之上
void fun(int a);
void fun(int );
函数的使用 --> 函数调用
哪里需要就在哪调用
函数名(实际参数);
fun(10);
fun(a);
实际参数简称实参,实参可以是某个变量或者表达式或者常量
函数传参:
1.基本数据类型作为参数在函数之间传递:{
复制传递(值传递) 地址传递 全局变量
复制传递:{
值传递
将实参的值复制一份传递给形参,形参如何修改都不会影响实参
}
地址传递:{
实参传地址 --> 形参为指针
通过指针访问变量
}
}
2.数组作为参数在函数之间传递:{
复制传递(值传递) 地址传递 全局变量
复制传递和地址传递实质是一样:形参都是指针,只是写法不一样
注意:1.整型数组作为参数在函数之间传递,除了要传数组的首地址外,还需要传数组的长度
2.字符型数组作为参数在函数之间传递,可以不传字符串的长度
}
}
}
函数和指针:
int max();
int (*p)() = &max; // 函数指针 指向函数的指针!
int *q();
函数指针{ 其本质是一个指针
指向函数的指针!!! 它的所有操作和普通指针相同,只是指向一个函数!
格式: <数据类型> (*<指针变量名>)(参数列表);
数据类型: 指针指向的函数的 返回值的数据类型
参数列表: 必须和指针要指向的函数 的参数列表相同
}
指针函数{ 其本质是一个函数!!
就是指 返回值是 指针(地址) 的函数 就叫指针函数
格式: <数据类型> *<函数名>(参数列表);
数据类型 *: 函数返回的是一个 数据类型 *(地址)
参数列表: 函数需要传入的参数
}
错误请纠正 ↩︎