注:编码工具是CLion+Cygwin
目录
多级指针
指针存放的是内存地址,一级指针存放的是普通变量的内存地址,二级指针存放的是一级指针的内存地址,三级指针存放的是二级指针的内存地址。
//
// Created by Administrator on 2021/10/30.
//
#include <stdio.h>
int main(){
int num = 99;
int *num_p = #
int **num_pp = &num_p;
int ***num_ppp = &num_pp;
printf("num的内存地址是%p, num_p的值是%p\n", &num, num_p);
printf("num_p的内存地址是%p, num_pp的值是%p\n", &num_p, num_pp);
printf("num_pp的内存地址是%p, num_ppp的值是%p\n", &num_pp, num_ppp);
printf("num的值是%d, *num_p的值是%d, **num_pp的值是%d, ***num_ppp的值是%d\n",
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循环遍历
数组定义格式:数据类型 变量名[元素个数];数据类型 变量名[] = {初始化元素列表}。
方式一:
#include <stdio.h>
int main(){
int arr[4];
int i;
for(i = 0; i < 4; i ++){
arr[i] = i;
}
for(i = 0; i < 4; i ++){
printf("%d\n", arr[i]);
}
return 0;
}
输出:
0
1
2
3
方式二:
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30, 40};
int i;
for(i = 0; i < 4; i ++){
printf("%d\n", arr[i]);
}
return 0;
}
输出:
10
20
30
40
数组的内存地址与首元素内存地址
数组的内存地址==数组首元素的内存地址
#include <stdio.h>
int main(){
int arr[] = {1,3,5,7};
printf("arr = %p\n", arr);
printf("&arr = %p\n", &arr);
printf("&arr[0] = %p\n", &arr[0]);
return 0;
}
输出:
arr = 0xffffcc30
&arr = 0xffffcc30
&arr[0] = 0xffffcc30
C语言数组没有下标越界
#include <stdio.h>
int main(){
int arr[] = {1,3,5,7};
printf("arr[1000] = %d\n", arr[1000]);
return 0;
}
输出:
arr[1000] = 0
用指针方式遍历数组
#include <stdio.h>
int main(){
int arr[] = {1,3,5,7};
int i;
for(i = 0; i < sizeof arr / sizeof(int); i ++){
printf("%d\n", *(arr + i));
}
return 0;
}
输出:
1
3
5
7
用指针方式给数组元素赋值
#include <stdio.h>
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测试如下:
#include <stdio.h>
int main(){
long * lp;
int * ip;
char * cp;
printf("%d %d %d\n", sizeof lp, sizeof ip, sizeof cp);
return 0;
}
输出:
8 8 8
函数指针
案例一:
#include <stdio.h>
void plus(int a, int b) {
printf("a + b = %d\n", a + b);
}
void minus(int a, int b) {
printf("a - b = %d\n", 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 = %p\n", plus, &plus);
calc(10000, 1,minus);
calc(10000, 1, &minus);
printf("minus = %p, &minus = %p\n", 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 <stdio.h>
void plus(int a, int b) {
printf("a + b = %d\n", a + b);
}
void minus(int a, int b){
printf("a - b = %d\n", 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 <stdio.h>
void add(int a, int b){
printf("a + b = %d\n", 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