深入了解指针(1)

本文详细介绍了C语言中指针的概念,包括指针作为内存地址的访问工具,指针变量的定义、类型和大小,以及const修饰符的应用。同时探讨了void*指针、野指针的产生原因和处理,以及传值调用与传址调用的区别。

内存与地址

学习指针,我们首先要了解指针,指针是用来访问内存的。举个例子,就像过节走亲访友,首先我们要知道地址,才可以去拜访。那么指针的作用就是地址,用于以后可以轻松的访问到内存。也可以这么理解:内存的单元编号==地址==指针。

指针变量与地址

&,在C语言中,名为取地址的操作符,例如:

int main()
{
    int a=0;
    printf("%p",&a);
    return 0;
}

这样便可以得到a的地址。

得到的地址p也是一个变量,其中存放的是a的地址。那我们该如何定义这种变量呢?

指针类型

定义指针首先要了解指针的类型,有int型,有char型,还有float型......

其次我们还要知道一个解引用的操作符(*)

//整型
int a=20;
int*p=&a;

指针变量的大小

有地址总线决定,我们知道,计算机有32位也有64位,所以指针的大小也有两种,四个字节和八个字节,其中32位有32个比特位,也就是4个字节,64位则是8个字节。而且指针的大小与前面说的指针的类型不同,指针的大小只和平台有关,与指针的类型无关。

指针类型的意义

指针的类型决定了对指针解引用时的权限大小(一次可以操作几个字符)

例如;char*的指针只能访问一个字节,int*的指针可以访问四个字节。

指针+-整数

上面我们说了char*与int*的区别,所以他们+-一个整数的结果也是不一样的。

char*类型的指针+1跳过一个字节,而int*类型的指针+1跳过4个字节。

所以结论:指针类型决定了指针向前或者向后走一步的距离大小。

void*指针

上面介绍的指针在定义时我们知道其类型,而如果我们并不知道的话,便可以用void*指针,

void*指针可以理解为无具体类型的指针(泛型指针)可以接受任何类型的地址,但是这类指针并不可以直接进行+-整数的操作,也不可以进行解引用的操作。所以我们一般使用在函数参数的部分,用来接收不同类型数据的地址,实现泛型编程的效果。

const修饰指针

const修饰变量

通过使用const修饰,可以使一个变量具有常属性,但本质上还是变量(在c++中const修饰后变量会变成常量)具有常属性之后,这个变量变得不可被修改,但是通过指针我们依旧可以改变存在一个变量里面的值,如:

可以看出n的值改变了,这是不符合const限制的,所以是不合理的,那么如何让指针也无法改变const定义后的变量的值呢?

const修饰指针变量

如果const放在*左边修饰的是指针内容,指针内容就不会发生改变。但是指针变量本身可以改变。

运行后我们可以发现,n所指的值还是10,即所存的数值没有改变。但是p的指向改变了。

int main()
{
    int n=10;
    int m=20;
    int const * p=&n;
    *p=20;
    p=&m
}

相反的,如果放在*右边的话,p中所存放的值会发生改变,而p的指向并不会发生改变,*p不变。

如果*前后都有const限制的话,那么两个值都不会发生改变。

指针运算

分为三种:指针+-整数;指针-指针;指针的关系运算(指针比较大小)。

注意:指针-指针的运算方式的两个指针指向同一块空间。

野指针

概念:就是指针指向的位置是不可知的(随机的,不正确的,没有限制的)

产生野指针的原因

1.指针未初始化

int main()
{
    int * p;//局部变量未初始化,默认为随机值
    *p=20;
return 0;
}

2.指针的越界访问

如出现在数组当中,超出数组的大小。

3.指针指向的空间释放

不能返回局部变量的地址。

assert断言

assert()括号内只要是表达式都可以,如果表达式的结果为假,assert()就会报错,使程序的执行中止。可以用来判断一个指针是否是一个空指针。

#include<assert.h>

是他的头文件。

传值调用和传址调用

传址调用,可以让函数和主调函数(不是主函数,是自己创建的函数)之间建立真正的联系,,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数的变量值来实现计算,就可以采用传值调用(人话:只用不改变)如果函数内部要修改主调函数中变量的值,就需要传址调用。

结语:关于指针的学习并没有结束,后续还会有更多关于指针的介绍。

Matlab基于粒子群优化算法及鲁棒MPPT控制器提高光伏并网的效率内容概要:本文围绕Matlab在电力系统优化与控制领域的应用展开,重点介绍了基于粒子群优化算法(PSO)和鲁棒MPPT控制器提升光伏并网效率的技术方案。通过Matlab代码实现,结合智能优化算法与先进控制策略,对光伏发电系统的最大功率点跟踪进行优化,有效提高了系统在不同光照条件下的能量转换效率和并网稳定性。同时,文档还涵盖了多种电力系统应用场景,如微电网调度、储能配置、鲁棒控制等,展示了Matlab在科研复现与工程仿真中的强大能力。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的高校研究生、科研人员及从事新能源系统开发的工程师;尤其适合关注光伏并网技术、智能优化算法应用与MPPT控制策略研究的专业人士。; 使用场景及目标:①利用粒子群算法优化光伏系统MPPT控制器参数,提升动态响应速度与稳态精度;②研究鲁棒控制策略在光伏并网系统中的抗干扰能力;③复现已发表的高水平论文(如EI、SCI)中的仿真案例,支撑科研项目与学术写作。; 阅读建议:建议结合文中提供的Matlab代码与Simulink模型进行实践操作,重点关注算法实现细节与系统参数设置,同时参考链接中的完整资源下载以获取更多复现实例,加深对优化算法与控制系统设计的理解。
指针是C语言中非常强大但又容易出错的特性之一。深入了解指针有助于编写高效、灵活的代码,也能帮助我们更好地理解底层内存操作。 ### 一、指针的基本概念 指针是一个变量,其值为另一个变量的地址。在C语言中,每个变量都有一个内存地址,我们可以使用 `&` 运算符获取变量的地址,并使用 `*` 运算符声明指针和访问指针所指向的值。 ```c int a = 10; int *p = &a; // p 是指向 int 的指针,保存了 a 的地址 printf("a 的值: %d\n", *p); // 通过指针访问 a 的值 ``` ### 二、指针的本质 指针的本质是一个地址。在内存中,每一个字节都有一个唯一的地址编号(内存地址)。指针变量中存储的是某个变量在内存中的起始地址。 ### 三、指针的类型 指针是有类型的,比如 `int*`、`char*`、`float*` 等。指针类型决定了指针所指向的数据类型,也决定了指针在进行加减运算时的步长。 ```c int arr[3] = {1, 2, 3}; int *p = arr; p++; // 指针移动的步长是 sizeof(int),通常是4字节 ``` ### 四、指针与数组的关系 数组名在大多数情况下会被视为指向数组第一个元素的指针。数组和指针可以互换使用,但数组名是常量指针,不能进行赋值。 ```c int arr[] = {1, 2, 3}; int *p = arr; for(int i = 0; i < 3; i++) { printf("%d ", *(p + i)); } ``` ### 五、指针与函数 指针可以作为函数参数,实现对实参的修改;也可以作为函数返回值,返回一个地址。 ```c void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 5, y = 10; swap(&x, &y); printf("x = %d, y = %d\n", x, y); // 输出 x = 10, y = 5 return 0; } ``` ### 六、指针与动态内存分配 使用 `malloc`、`calloc`、`realloc` 和 `free` 可以在堆上动态分配内存,返回的是一个指针。 ```c int *arr = (int *)malloc(5 * sizeof(int)); if(arr != NULL) { for(int i = 0; i < 5; i++) { arr[i] = i + 1; } free(arr); // 释放内存 } ``` ### 七、野指针与空指针 - **野指针**:指向不确定地址的指针,未初始化或指向已被释放的内存。 - **空指针**:值为 NULL 的指针,表示不指向任何地方。 ```c int *p = NULL; // 空指针 int *q; // 野指针 ``` 使用前应始终检查指针是否为 NULL。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值