C语言学习笔记——(二)指针运算和函数指针

注:编码工具是CLion+Cygwin

目录

多级指针

数组与数组指针

多个操作系统平台兼容的for循环写法:

C语言数组的定义与for循环遍历

方式一:

方式二:

数组的内存地址与首元素内存地址

C语言数组没有下标越界

用指针方式遍历数组

用指针方式给数组元素赋值

指针类型有什么作用?

函数指针

案例一:

案例二:

案例三:函数指针的三种调用方式



多级指针

        指针存放的是内存地址,一级指针存放的是普通变量的内存地址,二级指针存放的是一级指针的内存地址,三级指针存放的是二级指针的内存地址。

//
// Created by Administrator on 2021/10/30.
//
#include <stdio.h>

int main(){
    int num = 99;
    int *num_p = &num;
    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 = &plus;
    calc(3, 9, cal);
    cal = minus;
    calc(10000, 1, cal);
    cal = &minus;
    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值