指针与结构体

简介: 指针与结构体

前言

最近又重新学习了一下指针和结构体,感觉收获颇多,这不来把我那点所学分享该大家。

1 啥是指针

刚刚接触指针的同学肯定会很懵逼,指针是啥啊?指南针哈哈,不和大家开玩笑,我们进行正题吧,指针的本质就是地址,但我们要注意我们口头上常说的指针并非指针,而是指针变量。

1.1指针与指针变量

指针:内存中一个最小单元的编号,也就是地址。

指针变量:是用来存放内存地址的变量。

我们可以看下面的这张图。

为了唯一标识一块内存空间,在C语言中就用指针来标记,就像我们的寝室的门牌号一样,假设张三的寝室门排号是A602,A602就是地址也就是指针,为了让张三的寝室方便被人找到,我们肯定是要在系统是登记有怎么个寝室,下次来张三寝室也就方便,而在C语言中,就用指针变量来存放我们的地址通常用&地址操作符来取出地址在存放在指针变量

#include<stdio.h>
 
int main()
{
  int a = 0;
  int* p = &a;
  *p = 1;
  return 0;
}

从中我们可以看出,我们可以通过指针变量p解引用(*),来找到a从而更改a的值。

从上面图中我们知道在内存中的每一块空间的大小都是一个字节,那么对一个32平台的机器,就有32根地址线,地址线上能产生高电平(1)和低电平(0),这样的话就能产生2的32次方个地址。

2的32次方个地址

2^32Byte == 2^32/1024KB == 2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB),4G的空闲进行编址

对于62位平台

便有2的62地址

2^64Byte == 2^64/1024KB == 2^64/1024/1024MB==2^64/1024/1024/1024GB ==17,179,869,184GB这样我们可以编码的空间就会很的多。

1.2总结

1指针本质是地址,指针变量是用来存放地址的。

2指针在32位平台的大小为,4个字节,在62位平台为8个字节

2 指针和指针类型

指针的类型,其实,和变量的类型差不多,就是变量了类型多个*号

常见的指针类型

char  *pc = NULL;

int   *pi = NULL;

short *ps = NULL;

long  *pl = NULL;

float *pf = NULL;

double *pd = NULL;

2 .1指针+-整数

指针的+-整数其实反应的是指针跳过的字节,决定了指针的步长。

#include<stdio.h>
 
int main()
{
  int arr[5] = { 1,2,3,4,5 };
  int* p = arr;
  printf("%d\n", *p);
  printf("%d\n", *(p + 1));
  printf("%d\n", *(p + 2));
  return 0;
}

arr指的是首元素的地址,存放在指针变量p上,我们*p就可以找到数组的第一个元素,那么*(p+1)指的又是上面呢,其实他指的是跳过一个4个字节,为什么是4个字节而不是一个字节呢,这就跟指针变量的类型有关系了,因为p是int*s是4个字节,如果是char*我们+1又会发生什么呢?

这时我们观察到打印了0,我们*(p+4)才早的数组的第二个元素,这是因为数组arr中的每个元素都是4个字节的,而char*p类型的指针加1只能跳过1个字节,这时候找的首地址就不对了。

3 野指针

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

3.1 野指针的成因

1 指针未初始化

2 指针越界访问

3  指针指向的空间释放

这里虽然可以打印出6来,但这样的访问是非法的,因为形参在出函数就会销毁。

3.2 如何避免野指针的出现

1. 指针初始化

2. 小心指针越界

3. 指针指向空间释放即使置NULL

4. 避免返回局部变量的地址

5. 指针使用之前检查有效性

其中我们可以养成一个习惯,当我们不知道给指针初始化何值时,我们可以初始化指针为NULL(0),在对指针赋值的时候在判断一下,就可以一定程度上避免野指针。

4 二级指针

简单的说就是存放一级指针的地址

图中ppa便是二级指针变量,存的一级指针变量的地址。

5 指针数组

存放指针的数组,指针数组本质是数组。

其中的parr变是指针数组,其中parr[10]等价于*(parr+10);

指针数组可以模拟一个二维数组

6 结构体

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

6.1 结构的声明

struct tag

{

member-list;

}variable-list;

struct:  是结构体类型的关键字

struct tag是用户定义的结构体类型

member-list:是结构体成员

variable-list:结构体类型变量

其中结构的成员可以是变量、数组、指针,甚至是其他结构体。

6.2 结构体变量的定义和初始化

结构体变量的定义就是给结构体类型取一个变量。

结构体的初始化

6.3 结构体的访问

结构体变量成员用 .访问

结构体变量指针->访问

6.4 结构体传参

传参有二种,但对于结构体来说传址调用是最好的,

函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

所以:结构体传参的时候,要传结构体的地址

结束语

大家喜欢的话,来个三连吧。



目录
打赏
0
0
0
0
33
分享
相关文章
指向结构体数组的指针
指向结构体数组的指针
216 2
【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境
【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境
129 1
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
663 13
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
179 4
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
124 7
结构体\结构体指针
结构体\结构体指针
64 3
使用unsafe库操作结构体的属性偏移和指针转换
【5月更文挑战第19天】Go语言是类型安全的,但通过`unsafe`包,可以进行结构体属性偏移量计算和指针转换。`unsafe.Offsetof`获取结构体字段的偏移量,`unsafe.Pointer`允许不同类型指针间的转换。然而,这可能导致类型安全屏障被绕过,若使用不当,会引发安全问题或panic。应谨慎使用`unsafe`,因为它不遵循GO 1兼容性准则。
119 0
使用unsafe库操作结构体的属性偏移和指针转换
结构体指针
结构体指针
200 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问