注:编码工具是CLion+Cygwin
目录
多级指针
数组与数组指针
多个操作系统平台兼容的for循环写法:
C语言数组的定义与for循环遍历
方式一:
方式二:
数组的内存地址与首元素内存地址
C语言数组没有下标越界
用指针方式遍历数组
用指针方式给数组元素赋值
指针类型有什么作用?
函数指针
案例一:
案例二:
案例三:函数指针的三种调用方式
多级指针
指针存放的是内存地址,一级指针存放的是普通变量的内存地址,二级指针存放的是一级指针的内存地址,三级指针存放的是二级指针的内存地址。
// // Created by Administrator on 2021/10/30. // #includeint main(){ int num = 99; int *num_p = # int **num_pp = &num_p; int ***num_ppp = &num_pp; printf("num的内存地址是%p, num_p的值是%pn", &num, num_p); printf("num_p的内存地址是%p, num_pp的值是%pn", &num_p, num_pp); printf("num_pp的内存地址是%p, num_ppp的值是%pn", &num_pp, num_ppp); printf("num的值是%d, *num_p的值是%d, **num_pp的值是%d, ***num_ppp的值是%dn", num, *num_p, **num_pp, ***num_ppp); return 0; }
输出:
num的内存地址是0xffffcc34, num_p的值是0xffffcc34 num_p的内存地址是0xffffcc28, num_pp的值是0xffffcc28 num_pp的内存地址是0xffffcc20, num_ppp的值是0xffffcc20 num的值是99, *num_p的值是99, **num_pp的值是99, ***num_ppp的值是99
数组与数组指针
多个操作系统平台兼容的for循环写法:
int i;
for(i = 0; i < 4; i ++){
}
C语言数组的定义与for循环遍历
int i;
for(i = 0; i < 4; i ++){
}
C语言数组的定义与for循环遍历
数组定义格式:数据类型 变量名[元素个数];数据类型 变量名[] = {初始化元素列表}。
方式一:
#include
int main(){
int arr[4];
int i;
for(i = 0; i < 4; i ++){
arr[i] = i;
}
for(i = 0; i < 4; i ++){
printf("%dn", arr[i]);
}
return 0;
}
输出:
0 1 2 3
方式二:
#include
int main(){
int arr[] = {10, 20, 30, 40};
int i;
for(i = 0; i < 4; i ++){
printf("%dn", arr[i]);
}
return 0;
}
输出:
10 20 30 40
数组的内存地址与首元素内存地址
数组的内存地址==数组首元素的内存地址
#includeint main(){ int arr[] = {1,3,5,7}; printf("arr = %pn", arr); printf("&arr = %pn", &arr); printf("&arr[0] = %pn", &arr[0]); return 0; }
输出:
arr = 0xffffcc30 &arr = 0xffffcc30 &arr[0] = 0xffffcc30
C语言数组没有下标越界
#include
int main(){
int arr[] = {1,3,5,7};
printf("arr[1000] = %dn", arr[1000]);
return 0;
}
输出:
arr[1000] = 0
用指针方式遍历数组
#include
int main(){
int arr[] = {1,3,5,7};
int i;
for(i = 0; i < sizeof arr / sizeof(int); i ++){
printf("%dn", *(arr + i));
}
return 0;
}
输出:
1 3 5 7
用指针方式给数组元素赋值
#include
int main(){
int arr[8];
int i;
for(i = 0; i < 8; i ++){
*(arr + i) = 10001 + i;
}
for(i = 0; i < 8; i ++){
printf("%d ", *(arr + i));
}
printf("n");
return 0;
}
输出:
10001 10002 10003 10004 10005 10006 10007 10008
指针类型有什么作用?
跨函数修改变量值;
用指针方式访问数组元素的时候,编译器知道如何取元素,内存地址每次加固定长度,不同类型的指针每次增加长度不同。
可以用sizeof 指针类型变量的方式获取指针类型变量所占的内存大小。
64位IDE测试如下:
#includeint main(){ long * lp; int * ip; char * cp; printf("%d %d %dn", sizeof lp, sizeof ip, sizeof cp); return 0; }
输出:
8 8 8
函数指针
案例一:
#include
void plus(int a, int b) {
printf("a + b = %dn", a + b);
}
void minus(int a, int b) {
printf("a - b = %dn", a - b);
}
void calc(int a, int b, void(*c)(int, int)) {
c(a, b);
}
int main() {
calc(3, 9, plus);
calc(3, 9, &plus);
printf("plus = %p, &plus = %pn", plus, &plus);
calc(10000, 1,minus);
calc(10000, 1, &minus);
printf("minus = %p, &minus = %pn", minus, &minus);
return 0;
}
#includevoid plus(int a, int b) { printf("a + b = %dn", a + b); } void minus(int a, int b) { printf("a - b = %dn", a - b); } void calc(int a, int b, void(*c)(int, int)) { c(a, b); } int main() { calc(3, 9, plus); calc(3, 9, &plus); printf("plus = %p, &plus = %pn", plus, &plus); calc(10000, 1,minus); calc(10000, 1, &minus); printf("minus = %p, &minus = %pn", minus, &minus); return 0; }
输出:
a + b = 12 a + b = 12 plus = 0x100401080, &plus = 0x100401080 a - b = 9999 a - b = 9999 minus = 0x1004010ab, &minus = 0x1004010ab
案例二:
#include
void plus(int a, int b) {
printf("a + b = %dn", a + b);
}
void minus(int a, int b){
printf("a - b = %dn", a - b);
}
void calc(int a, int b, void(*c)(int, int)) {
c(a, b);
}
int main() {
void(*cal)(int, int);
cal = plus;
calc(3, 9, cal);
cal = +
calc(3, 9, cal);
cal = minus;
calc(10000, 1, cal);
cal = −
calc(10000, 1, cal);
return 0;
}
输出:
a + b = 12 a + b = 12 a - b = 9999 a - b = 9999
案例三:函数指针的三种调用方式
#include
void add(int a, int b){
printf("a + b = %dn", a + b);
}
void calc(int a, int b, void(*cal)(int, int)){
cal(a, b);
(*cal)(a, b);
(cal)(a, b);
}
int main(){
calc(3, 13, add);
return 0;
}
输出:
a + b = 16 a + b = 16 a + b = 16



