《每天一分钟学习C语言·七》指针、字节对齐等

1、
对于二维数组如a[3][4]可以当做有三个元素的一维数组,每个元素包含四个小元素。

2、
printf(“%-5d”, i); //负号表示左对齐,5d表示空五个光标的位置

3、
栈:先进后出,堆:先进先出

4、
(1)int * p; //p是指针变量名字, int *表示p变量存放的是int类型的地址,p = &i; // 把i地址赋给了p,此时p指向i, * p为p指向的地址存放的变量,即 * p为i的整型变量的值。
(2)指针就是地址,地址就是指针,地址就是内存单元的编号
(3)指针变量就是存放地址的变量
(4)CPU可以直接操控内存条
(5)int *p; * p=3; //错误,因为指针变量p没有初始化
(6)int * p; //没有给指针变量初始化,p指向内存单元随意一个编号,这种情况下是不能读写随意编号里面存放的内容的,则输出 * p错误,比如随意指向了电脑图库的地址,如果能随意读写就侵犯隐私了。
(7)假如指针变量p,q同时指向一个地址,那free( p);表示p指向的空间被释放,不能在free(q);,因为p,q指向同一个空间,这个空间已经在free( p)的时候已被释放,如果没有被释放,那这个内存的空间就会被一直占有,会容易导致内存泄漏;
(8)int * p = (int * )malloc(4); //动态分配四个字节内存空间,返回第一个字节地址给p,即p指向第一个字节的地址。之所以强制类型转换就是告诉P指向的地址是保存整型变量的地址。系统总共分配了8个字节的空间,静态分配指针变量p占4个字节,p指向的动态分配的内存空间占4个字节,一共8个。Free( p)表示把p指向的动态分配的内存空间给释放掉,但p本身的内存不会释放,因为p内存是静态分配的,这需要等函数执行结束由系统释放。
(9)静态内存都是在栈里分配的,动态内存在堆里分配
(10)int ** p中p存放的是地址的地址,如int i = 3; int * q = &i; p = &q;
则 * p == q,又 * q == i,所以**p == i

5、
指针和数组
(1)数组名是第一个元素的地址,则p[0] == *p p[i] == *(p+i)
(2)数组是连续的
(3)a[2]; b[2]; a = b //error,数组名是指针常量,常量不可以被赋值
(4)

void f(int a[])
{int i;int j = sizeof(a);printf("%d\n", j); //长度为4/*for(i=0; i<sizeof(p)/sizeof(*p); i++)printf("%d\n", *(p+i));*/
}int main(void)
{int a[5] = {1, 2, 3, 4, 5};printf("%d\n", sizeof(a)); //长度为20f(a);getchar();return 0;
}

主函数输出长度为20,自定义函数输出长度为4,那是因为把数组名传入自定义函数就自动转化为指针的形式进行操作,而指针的长度32位系统固定为4,64位系统固定为8(注意:32位系统和64位系统中编译器为了相互兼容指针都占4个字节)
(5)如果两个指针变量指向的是同一个连续空间不同的存储单元,这两个指针可以相减,比如在数组里。
(6)一个变量的地址比如1001H地址里面存放3这个整型,这个1001H是整型的首个字节的地址,因为整型有四个字节,而指针指向的变量的地址都是首地址。
(7)动态定义一维数组

int len;
int i;
int * p;printf("输入一维数组的长度:");
scanf("%d", &len);
p = (int *)malloc(len * 4); //给p指向的空间分配len*4个字节空间,假如len = 4;//*p为前四个字节存放的整型,*(p+1)为后四个字节存放的整型,*(p+2)为后后四个字节存放的整型//*(p+3)为最后一组四个字节存放的整型
//给动态数组赋值
*p = 1;
p[1] = 2; //*(p+1) == p[1]
*(p+2) = 3;
*(p+3) = 4;for(i=0; i<4; i++)printf("%d\n", *(p+i)); //1 2 3 4
free(p);

6、
指针的一个不容易想通的问题,以后指针出问题就看这个例子

int main(void)
{int i = 2;int * p;f1(p);printf("%d\n", *p);getchar();return 0;
}void f1(int * q)
{*q = 3;
}

显示结果错误,p没有初始化,随意的指向了内存的一个空间,又把这个地址给了q,及p,q指向了一个相同的内存空间,*q修改了这个内存空间的内容是错误的,不确定的一个内存空间的内容是无法读写的。

第二种:

int main(void)
{int i = 2;int * p = &i;f1(p);printf("%d\n", *p);getchar();return 0;
}void f1(int * q)
{q = (int *)malloc(4);*q = 3;
}

输出答案是2不是3,首先p指向i的地址,则p == 2,把p地址赋给q,则p,q共同指向i地址,这时若q = 3,则i的值会变。但在函数里却给q分配了一个新的内存空间,这时q指向这个动态内存空间,跟p没关系,p依然指向i地址,这时p=3不会影响i的值,所以p依然为2

第三种:

int main(void)
{int i = 2;int * p = &i;f1(&p);printf("%d\n", *p);free(p);getchar();return 0;
}void f1(int ** q)
{*q = (int *)malloc(4);**q = 3;
}

答案为3不是2,首先把i地址赋给p,这时p指向i地址,p==2。然后把p地址的地址赋给q,这时q指向p地址的地址,q便是p地址,修改q的值便是修改p地址,这时若给q申请一个内存空间,那么q和p都指向这个内存空间,p不在指向i地址,这时给**q赋值,就是把q和p共同指向的内容空间放入值,那么*p就是这个值,用完要释放这个内存空间。

7、
结构体和联合体
struct student
{

};
struct student是一个数据类型,int ,double…也是一个数据类型。
struct student st; //定义一个struct student类型的变量st
两种赋值方式:struct student st = {50, 34.2f, ‘F’};
st.age = 20; st.score = 34.3f; st.sex = ‘F’;
第二种取值方式:struct student * pst = &st; //把st地址赋给pst,即pst指向st地址。printf(“%d\n”, pst->age); //20 pst->age = 10; //因pst指向的内存空间为st的内存空间,所以修改pst->age的值即st.age值也会变。另一个写法(*pst).age

(2)结构体占多少个字节数?
涉及到字节对齐,(需要字节对齐的根本原因在于CPU访问数据的效率问题)总的字节数必须是结构体中最大成员变量字节数的整数倍,前一个成员变量必须是后一个成员变量字节的整数倍,不足自动补齐。(注:结构体首地址是第一个成员地址)如

struct student
{int num;doube mark;char name;
}

int占四个字节,double占八个字节,所以int自动补齐四个字节一共八个字节是double整数倍,这时一共4+4+8=16个字节是char字节数的整数倍,这时总字节数为4+4+8+1=17不满足是最大成员变量double字节数的整数倍,故在自动补齐7个字节,这时一共是24个字节。sizeof(struct student) == 24

struct student
{char ch[5];short k[3];char arr[9];
}

整除是整除的数据类型。5不能被short(2)整除,故5+1
5+1+6=12可以被char(1)整除
12+9=21不能被最大数据类型short(2)整除,故21+1=22

union uni
{struct s{short a[5];};double i;char a[9];
};

注意:联合体中如果有结构体,字节对齐时会忽略结构体的存在,相当于联合体中只有double i和char a[9],或者如果结构体中有结构体,字节对齐时会忽略这个结构体的存在。
先找最大宽度字节数为9, 9不能被double(8)整除,故9+7=16
16既能被char整除又能被double整除

union uni
{char a[11];short i[3];double k[2];
};

先找最大宽度字节16,16能被char(1)整除,然后16又能被short(2)整除,能被double整除,故为16

还有一种情况:

struct st2 {double i;
};struct st1 {struct st2 st;int i;
};

printf(“%d\n”, sizeof(struct st1)); //这种情况会把嵌套的结构体字节数算进去,嵌套结构体字节数为8,则8+4+4 = 16是最大数据类型double (8)的倍数

union uni
{char a[11];short i[3];double k[2];
};struct student {union uni u;int j;
}st;

联合体字节数:16,结构体总字节数:16+4+4=24是最大数据类型double (8)的倍数

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/222742.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolo-nas无人机高空红外热数据小目标检测(教程+代码)

前言 YOLO-NAS是目前最新的YOLO目标检测模型。从一开始&#xff0c;它就在准确性方面击败了所有其他 YOLO 模型。与之前的 YOLO 模型相比&#xff0c;预训练的 YOLO-NAS 模型能够以更高的准确度检测更多目标。但是我们如何在自定义数据集上训练 YOLO NAS&#xff1f; 这将是我…

基于ERC20代币协议实现的去中心化应用平台

文章目录 内容简介设计逻辑ERC20TokenLoanPlatform 合约事件结构体状态变量函数 Remix 运行实现部署相关智能合约存款和取款贷款和还款 源码地址 内容简介 使用 solidity 实现的基于 ERC20 代币协议的借贷款去中心化应用平台(极简版)。实现存款、取款、贷款、还款以及利息计算的…

[Angular] 笔记 7:模块

Angular 中的模块(modules) 是代码在逻辑上的最大划分&#xff0c;它类似于C, C# 中的名字空间&#xff1a; module 可分为如下几种不同的类型&#xff1a; 使用模块的第一个原因是要对代码进行逻辑上的划分&#xff0c;第二个非常重要的原因是为了实现懒惰加载(lazy loading)&…

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享

作者&#xff1a;索增增&#xff08;小红书&#xff09;、宋泽辉&#xff08;小红书&#xff09;、张佐玮&#xff08;阿里云&#xff09; 背景介绍 Koordinator 是一个开源项目&#xff0c;基于阿里巴巴在容器调度领域多年累积的经验孵化诞生&#xff0c;目前已经支持了 K8s…

hiveserver负载均衡配置

一.安装nginx 参数我的另一篇文章&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/135152478 二.配置nginx服务参数 worker_processes 1; events { worker_connections 1024; } stream { upstream hiveserver2 { # least_conn; # 使用最少连接路由…

【Amazon 实验①】使用Amazon WAF做基础 Web Service 防护

文章目录 一、实验介绍二、实验环境准备三、验证实验环境四、Web ACLs 配置 & AWS 托管规则4.1 Web ACLs 介绍4.2 Managed Rules 托管规则4.3 防护常见威胁类型&#xff08;sql注入&#xff0c;XSS&#xff09;4.4 实验步骤4.4.1 创建Web ACL4.4.2 测试用例4.4.3 测试结果4…

csrf自动化检测调研

https://github.com/pillarjs/understanding-csrf/blob/master/README_zh.md CSRF 攻击者在钓鱼站点&#xff0c;可以通过创建一个AJAX按钮或者表单来针对你的网站创建一个请求&#xff1a; <form action"https://my.site.com/me/something-destructive" metho…

The Cherno C++笔记 03

目录 Part 07 How the C Linker Works 1.链接 2.编译链接过程中出现的错误 2.1 缺少入口函数 注意:如何区分编译错误还是链接错误 注意&#xff1a;入口点可以自己设置 2.2 找不到自定义函数 2.2.1缺少声明 2.2.2自定义函数与引用函数不一致 2.3 在头文件中放入定义 …

编译原理----算符优先级的分析(自底向上)

自底向上分析的分类如下所示&#xff1a; 算符优先分析 算符优先分析只规定算符之间的优先关系&#xff0c;也就是只考虑终结符之间的优先关系。 &#xff08;一&#xff09;若有文法G&#xff0c;如果G没有形如A->..BC..的产生式&#xff0c;其中B和C为非终结符&#xff…

rtsp视频在使用unity三维融合播放后的修正

1 rtsp 接入 我们使用unity UE 等三维渲染引擎中使用c编写插件来接入rtsp 视频。同时做融合的时候&#xff0c;和背景的三维颜色要一致&#xff0c;这就要使用视频融合修正技术。包括亮度&#xff0c;对比度&#xff0c;饱和度的修正。在单纯颜色上的修正可以简单使用rgb->…

NXP iMX8MM 通过 TFTP和 NFS 启动示例

By Toradex秦海 1). 简介 嵌入式 Linux 设备开发调试时候为了方便部署各种配置和修改常用的一种方法就是通过网络启动&#xff0c;具体就是将 Linux Kernel&#xff08;以及 Device tree/Device Tree overlays) 从开发主机的 TFTP 服务加载&#xff0c; Linux rootfs 通过开发…

听GPT 讲Rust源代码--src/tools(18)

File: rust/src/tools/rust-analyzer/crates/ide-ssr/src/from_comment.rs 在Rust源代码中的from_comment.rs文件位于Rust分析器&#xff08;rust-analyzer&#xff09;工具的ide-ssr库中&#xff0c;它的作用是将注释转换为Rust代码。 具体来说&#xff0c;该文件实现了从注…

【即插即用篇】YOLOv8改进实战 | 引入 Involution(内卷),用于视觉识别的新一代神经网络!涨点神器!

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成…

Centos7在安装Graylog时新安装MongoDB报错端口不监听服务不启动无法运行启动失败

由于虚拟机服务器上需要安装Graylog需要安装MongoDB&#xff0c;尝试官网下载安装包&#xff0c;和yum安装均无法正常启动&#xff0c;折腾了好几天&#xff0c;重装了十几次&#xff0c;网上搜索了很多很多资料&#xff0c;均无法正常运行&#xff0c;百度上搜索各种文档&…

华为端口隔离简单使用方法同vlan下控制个别电脑不给互通

必须得用access接口&#xff0c;hybrid口不行 dhcp enable interface Vlanif1 ip address 192.168.1.1 255.255.255.0 dhcp select interface interface MEth0/0/1 interface GigabitEthernet0/0/1 port link-type access port-isolate enable group 1 interface GigabitEther…

Node.js-模块化(二)

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&…

Python之Django项目的功能配置

1.创建Django项目 进入项目管理目录&#xff0c;比如&#xff1a;D盘 执行命令&#xff1a;diango-admin startproject demo1 创建项目 如果提示diango命令不存在&#xff0c;搜索diango-admin程序的位置&#xff0c;然后加入到环境变量path中。 进入项目&#xff0c;cd demo…

嵌入式开发网络配置——windows连热点,开发板和电脑网线直连

目录 电脑 WiFi 上网&#xff0c;开发板和电脑直连 使用场景 设置VMware虚拟机的网络配置 Ubuntu设置——版本18.04 ​编辑 windows设置 开发板设置 原因&#xff1a;虚拟机Linux移植可执行程序到开发板失败 最后发现虚拟机的Linuxping不通开发板 下面是我的解决方法 …

微软的word文档中内置背景音乐步骤(打开自动播放)

目录 一、前言 二、操作步骤 一、前言 有时候需要在word文档里面打开的时候就自动播放音乐或者音频&#xff0c;那么可以用微软的word来按照操作步骤去这样完成。 如果没有微软office的&#xff0c;可以下载这个是2021专业版的。因为office只能免费使用一段时间&#xff0c…

猜数字游戏 C语言xdoj490

问题描述 猜数字游戏是令游戏机随机产生一个 100 以内的正整数&#xff0c;用户输入一个数对其进行猜测&#xff0c;需要你编写程序自动对其与随机产生的被猜数进行比较&#xff0c;并提示大了&#xff08;“Too big”&#xff09;&#xff0c;还是小了&#xff08;“Too smal…