C语言指针基础(1)

本文详细解析了C语言中的指针概念,通过实例展示了指针如何通过内存地址间接修改变量值,并深入探讨了指针与普通变量的区别。同时,文章通过一个字符串复制函数示例,展示了指针在实际应用中的作用。

C语言作为一门毅力几十年不倒的计算机语言,深受编程爱好者的喜欢。但是,许多人学习c语言(不管是计算机专业的,还是其他专业的),都会觉得C语言中的指针最难,甚至会因此放弃了c语言。但是,指针真的有那么难吗?下面就从这段代码开始我们的指针基础学习。

void main()
{ 
    int a = 10;
    int b = 20;
    int *p = &a;//p指向了a
    int *q = &b;//q指向了b

    *p = 11;//通过指针p修改了a的值
    *q = 21;//通过指针q修改了b的值

    a = 12;//直接修改
    b = 22;//直接修改

    printf("a = %d,b = %d\n",a,b);//12
    printf("*p = %d,*q = %d\n",*p,*q);//22

}

上面代码展示的就是通过变量名直接修改对应的内存的值和通过指针间接的修改内存的值。到这,可能很多人都会觉得很明白,没有疑惑。但是,我在注释中写的 “p指向了a” 这句话,你真的明白吗。看下面这张图:

这里写图片描述

在这张图中,我们可以看到变量p中存储着变量a的地址(类似于int a = 1,变量a存储着1);而这就是关键,所谓p指向a,就是指p所在的内存存储着a所在内存的地址。指针指向谁,就把谁的地址给它。另外,变量名p或a只是所在内存的别名而已。而对于指针变量与普通变量之间的差别,我们也就可以就此得出:指针变量与普通变量都只是一块内存的别名而已,只是指针变量的值是地址而已。

但事实上,上面的代码没有任何意义。为什么呢?我们明明可以直接用a等于多少来改变内存中的值,为什么还的绕一圈,用指针来修改呢。没错,在这,这就是多余的。指针最大的意义其实是作为函数指针。很多人在一个代码块中知道怎么用指针,但一旦指针到了另一个函数作为函数参数,就瞬间不知该去哪了。下面就从这段代码看看怎么用。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int copy_str(char *sou,char *des)
{
    int res = 0;
    if(sou == NULL || des == NULL)//先做指针是否为NULL的判断
    {
        res = -1;
        printf("copy_str err : %d  NULL",res);
        return res;
    }

    while(*sou != '\0')
    {
        *des = *sou;
        sou++;
        des++;
    }

    //到这说明此时*sou == '\0'
    *des = '\0';//des也得加'\0',表示字符串结束
    return res;
}

void main()
{ 

    char buf1[100];
    char buf2[100];
    int res = 0;

    //这句话的意思是针对buf1所指向的内存全部赋值为0
    memset(buf1,0,sizeof(buf1));
    memset(buf2,0,sizeof(buf2));

    strcpy(buf1,"cpy_str test");

    res = copy_str(buf1,buf2);
    if(res != 0)
    {
        //err 
        return;
    }

    printf("%s",buf2);

}

这段代码的主要功能就是拷贝字符串。C语言用字符串数组表示字符串。
下面就对这段代码进行详细的讲解。

首先,我从 “char buf1[100]”这句代码开始,可能很多人会直接跳过了这句,但事实上,这句话很重要,不了解这句话,就看不懂copy_str函数的参数。
chat buf1[100],表示在内存(栈)中分配100个字节的内存,而buf1表示这100字节个内存中首个字节的地址,假设chat buf1[100] = “asdqwe”;那么buf1就是表示‘a’的地址,打印buf1[0],就会得到‘a’显示。打印buf1[1],就会得到‘s’显示…… 值得注意的是,“asdqwe”其实在内存中全局区(常量区),是字符串常量初始化数组,它自动会在最后一个字符‘e’的后面加’\0’,表示结束,这也意味着buf[6] == ‘\0’。

在看int copy_str(char *sou,char *des)这个函数。我们是copy_str(buf1,buf2); 这样调用的。这句话的意思是sou = buf1,des = buf2;但这不够。我们得用内存的角度去思考,再画一个图:
这里写图片描述

这里可以想象成sou和des两个指针分别指向了buf1和buf2两个指针指向的内存(注意:数组名也是指针),我们要从内存的角度思考,两个指针都指向一片内存,我们不管通过*sou还是*buf1都是操作那片连续内存,可以说sou与buf1并没有什么关系,改变的都是那片内存。另外由于sou已经指向了buf1的那片内存的首地址。就可以通过*sou改变内存中的值。des也是如此。

再看 if(sou == NULL || des == NULL) 这句,我做了个小判断,如果sou或者des的值(指针变量的值就是指向的内存地址)为NULL,说明指针并未指向一片内存,没有内存的指针,毫无用处。*sou也根本没有意义,因为根本就没有内存让指针操作。

再看
while(*sou != ‘\0’)
{
*des = *sou;
sou++;
des++;
}
这句,刚开始sou指向的buf1那片内存的首地址,也就是首个字节的地址,先判断首个字节的值是否为’\0’,不是的话说明字符串未结束。
将sou指向的内存的值,赋值给des指向的内存的值(buf2那片内存的首地址的值,就是*des)。也就是这个函数最主要的copy功能。

再关注sou++,表示sou指针的指向+1,也就是从第一个字节的地址,移动到了第二个字节的地址,值得注意的是指针的步长取决于指针类型。这里是char,也就是一个char1个字节,也意味着步长+1就是移动1个字节。des++一样。

到了循环的第二次还是先判断是否到底,再赋值,移动。直到碰到内存中的值为’\0’。

再看这句,
//到这说明此时*sou == ‘\0’
*des = ‘\0’;//des也得加’\0’,表示字符串结束

此时,*sou == ‘\0’,表示到了原字符数组的末尾,此时也需要给des此时指向的内存赋值’\0’;也表示这个字符串结束了。

这就是今天的C语言指针基础,可能第二个例子对初学者有点难,但是通过字符串练习一级指针真的是非常管用。另外,画图,也是非常重要的。你画的出来,才说明你真的了解指针背后的内存。指针一定要和内存配合。没有内存就没有指针。

一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值