栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

注:编码工具是CLion+Cygwin

目录

多级指针

数组与数组指针

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

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

方式一:

方式二:

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

C语言数组没有下标越界

用指针方式遍历数组

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

指针类型有什么作用?

函数指针

案例一:

案例二:

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



多级指针

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

//
// Created by Administrator on 2021/10/30.
//
#include 

int 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循环遍历

        数组定义格式:数据类型 变量名[元素个数];数据类型 变量名[] = {初始化元素列表}。

方式一:
#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

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

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

#include 

int 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测试如下:

#include 

int 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;
}

输出:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384299.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号