【C语言精髓之二级指针】结构体指针(

编程入门 行业动态 更新时间:2024-10-22 16:30:28

【C语言精髓之二级<a href=https://www.elefans.com/category/jswz/34/1768268.html style=指针】结构体指针("/>

【C语言精髓之二级指针】结构体指针(

结构体指针(随笔)

/*** @file            * @author			jUicE_g2R(qq:3406291309)————彬(bin-必应)*						通信与信息专业大二在读	* * @brief			结构体指针(随笔)* * @copyright		2023.10* @COPYRIGHT			 原创技术笔记:转载需获得博主本人同意,且需标明转载源** @language        C/C++** @IDE			   Base on Microsoft Visual Studio 2022*/

最近帮别人改C语言程序,才发现了自己对这部分还是理解不够深(平时写C++会忽略一些底层的东西),记录一下。

文章目录

  • 结构体指针(随笔)
    • 1 错误示范
      • 1-1 错误一:ptr->name
      • 1- 2 错误二:安全函数(非必要)
    • 2 正确示范

1 错误示范

//错误示范
typedef struct {char name[10];
} nodeN,*pNode;
...scanf_s("%s", ptr->name);				//此处有两个错误

1-1 错误一:ptr->name

  • 首先, p t r ptr ptr 是一个 指 针 指针 指针
  • 其次要知道 ->(箭头运算符) 和 .(点运算符) 近似,都是获取 类 ( 或 结 构 体 ) 类(或结构体) 类(或结构体) 成员 的 运 算 符 运算符 运算符( +* 等等一类的),这种通过 运 算 符 运算符 运算符 获取成员的方式叫做 访 问 访问 访问 ,而 访 问 访问 访问 的实质就是获取到数据
点运算符箭头运算符
直接返回访问得到的值返回指向结构体成员的指针
要求编译器知道结构体的定义不需要知道结构体的定义(因为是指针,无需知道具体定义,只需要知道指着哪个就行【即知道被指对象的地址就可以了】)
需要在使用 node.name 之前包含该结构体的头文件,这样不太适用于多文件开发【更偏向用于单文件】无需【因为不需要知道定义】

通过 &node.name 间接获得 ptr->name 的地址

nodeN node;
char *address = &node.name;		// 获取 ptr->name 的地址
printf("The address of ptr->name is: %p\n", address);

三者获得了相同的地址,那为何还是要加一个 & 呢?

printf("%p\n", ptr);					//00D1A8B0
printf("%p\n", ptr->name);				//00D1A8B0
printf("%p\n", &(ptr->name));			//00D1A8B0
  • 首先,取地址运算符 & 返回的结果一般认为是地址,实际上返回的就是一个指针(因为指针变量的值就是地址值)

    地 址 即 指 针 , 指 针 即 地 址 ! ! ! 地址即指针,指针即地址!!! 地址即指针,指针即地址!!!

  • 其次,这就要涉及 指针的指针 了。

    因为单纯的访问指针1 的话,就只需要使用一级指针1, 而 操作(修改)指针的话就要使用到二级指针,即这个指针的指针2(->ptr->name)。

    由于我们要通过 终端输入的方式 向 n a m e name name 这个结构体成员变量赋值,实质上是在修改指针1,就需要传入3 指针的指针2(来修改ptr->name这个指针)1,这样,我们就可以通过这个指针2 来访问和修改 ptr->name 所指向的内存位置上的数据。

1 ptr->name 这个指针

2 就是 1 的指针【或叫地址】

3 先以 一级指针 为例:

void update(*a){*a=2;}
int main(void) {int a=1;update(&a);		//更新整形变量 a 的值,需要传入 a 的指针(用 & 获取)printf_s("%d", a);
}

进一步 二级指针

void update(int** pp) {**pp = 2;}int main(void) {int a = 1;int* p = &a;		//p指向aupdate(&p);			//传入a的二级指针printf_s("%d", a);
}

1- 2 错误二:安全函数(非必要)

  • scanf_s 是 VS2022 中C语言使用的安全函数,第三个参数要添加这个变量的大小,可以用 sizeof(变量) 去获取。

2 正确示范

#define _C					//只编译C语言代码#ifdef _Cplusplus			//C++代码
#include <bits/stdc++.h>
using namespace std;typedef struct node {string name;
} *pNode ;int main(void) {pNode ptr = new node;cin >> ptr->name;cout << ptr->name;return 0;
}#else						//C代码(VS2022要求使用安全函数scanf_s与printf_s)
#include <stdio.h>
#include<malloc.h>typedef struct {char name[10];
} nodeN,*pNode;int main(void) {pNode ptr = (pNode)malloc(sizeof(nodeN));		//node是一个结构体指针变量,malloc为该指针指向的对象开辟了空间scanf_s("%s", &(ptr->name), sizeof(ptr->name));printf_s("%s", ptr->name);return 0;
}
#endif

更多推荐

【C语言精髓之二级指针】结构体指针(

本文发布于:2023-12-07 01:36:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1669676.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:指针   精髓   语言   结构

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!