服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言深入讲解指针与结构体的使用

C语言深入讲解指针与结构体的使用

2022-12-12 12:24^O^玩转编程 C/C++

指针提供了对地址操作的一种方法,因此,使用指针可使得C语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作数组。C数组允许定义可存储相同类型数据项的变量,结构是C编程中另一种用户自定义

1 啥是指针

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

1.1指针与指针变量

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

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

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

C语言深入讲解指针与结构体的使用

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

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

C语言深入讲解指针与结构体的使用

从中我们可以看出,我们可以通过指针变量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 指针和指针类型

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

常见的指针类型

har *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;
}

C语言深入讲解指针与结构体的使用

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

C语言深入讲解指针与结构体的使用

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

 

3 野指针

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

3.1 野指针的成因

1指针未初始化

C语言深入讲解指针与结构体的使用

2指针越界访问

C语言深入讲解指针与结构体的使用

3指针指向的空间释放

C语言深入讲解指针与结构体的使用

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

3.2 如何避免野指针的出现

1. 指针初始化

2. 小心指针越界

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

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

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

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

C语言深入讲解指针与结构体的使用

 

4 二级指针

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

C语言深入讲解指针与结构体的使用

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

 

5 指针数组

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

C语言深入讲解指针与结构体的使用

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

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

 

6 结构体

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

6.1 结构的声明

struct tag

{

member-list;

}variable-list;

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

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

member-list:是结构体成员

variable-list:结构体类型变量

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

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

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

结构体的初始化

C语言深入讲解指针与结构体的使用

6.3 结构体的访问

结构体变量成员用 .访问

结构体变量指针->访问

C语言深入讲解指针与结构体的使用

6.4 结构体传参

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

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

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

到此这篇关于C语言深入讲解指针与结构体的使用的文章就介绍到这了,更多相关C语言指针与结构体内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_61552595/article/details/124754011

延伸 · 阅读

精彩推荐
  • C/C++C语言中栈的两种实现方法详解

    C语言中栈的两种实现方法详解

    栈只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作,这篇文章主要介绍了C语言对...

    __山顶洞人__6822021-12-20
  • C/C++C语言中用于修改文件的存取时间的函数使用

    C语言中用于修改文件的存取时间的函数使用

    这篇文章主要介绍了C语言中用于修改文件的存取时间的函数使用,分别为utime()函数和utimes()函数的使用,需要的朋友可以参考下...

    C语言教程网8212021-03-10
  • C/C++C语言各种操作符透彻理解下篇

    C语言各种操作符透彻理解下篇

    C 语言提供了丰富的操作符,除了上篇中的算术操作符,移位操作符,位操作符,赋值操作符外,还有单目操作符、关系操作符、逻辑操作符、条件操作符...

    七忆岁和6962022-09-15
  • C/C++C语言预处理预编译命令及宏定义详解

    C语言预处理预编译命令及宏定义详解

    这篇文章主要为大家介绍了C语言预处理预编译命令及宏定义的详解,其中包含运行环境命名约定条件及#under等基础详解,有需要的朋友可以借鉴参考下...

    Bitdancing10862022-01-21
  • C/C++C++多线程获取返回值方法详解

    C++多线程获取返回值方法详解

    这篇文章主要介绍了C++多线程获取返回值方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    知道了呀~4662021-09-13
  • C/C++C语言中access/_access函数的使用实例详解

    C语言中access/_access函数的使用实例详解

    本文通过实例代码给大家介绍了C语言中access/_access函数的使用,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    fengbingchun8162021-08-02
  • C/C++C++使用模板实现单链表

    C++使用模板实现单链表

    这篇文章主要为大家详细介绍了C++使用模板实现单链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    牧童遥指杏花村丫9572021-07-16
  • C/C++Seesion在C++服务端的使用方法

    Seesion在C++服务端的使用方法

    这篇文章主要介绍了Seesion在C++服务端是怎么使用的?本文给出了解决方案和实例代码供大家参考,需要的朋友可以参考下...

    CPP后台服务器开发7382021-08-19