指针】结构体指针("/>
【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语言精髓之二级指针】结构体指针(
发布评论