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

news2025/2/2 22:44:31

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)); //长度为20
	f(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.coloradmin.cn/o/1328927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习笔记(一)从波士顿房价预测开始,梯度下降

从波士顿房价开始 目标 其实这一章节比较简单&#xff0c;主要是概念&#xff0c;首先在波士顿房价这个问题中&#xff0c;我们假设了一组线性关系&#xff0c;也就是如图所示 我们假定结果房价和这些参数之间有线性关系&#xff0c;即: 然后我们假定这个函数的损失函数为…

罗德与施瓦茨FSV40-N手持式频谱分析仪

描述 R&S FSV是速度最快、功能最全面的信号和频谱分析仪&#xff0c;适用于从事RF系统开发、生产、安装和服务的注重性能、注重成本的用户。 频率范围高达3.6 GHz/7 GHz/13.6 GHz/30 GHz 40 MHz分析带宽 0.4 dB级测量不确定度&#xff0c;最高7 GHz 针对GSM/EDGE、WCDMA/…

面试高频的TCP知识点总结,比我想象得还要详细

下午好&#xff0c;我的网工朋友。 TCP 作为传输层的协议&#xff0c;了解它&#xff0c;拿下它&#xff0c;是一个网络工程师素养的体现&#xff0c;也是面试中经常被问到的知识点。 我们账号之前的文章里也写过不少关于TCP相关的文章&#xff0c;感兴趣的朋友们可以点击下方…

Tekton

一. 概念 Tekton 官网 Github Tekton 是一种用于构建 CI/CD 管道的云原生解决方案&#xff0c;它由提供构建块的 Tekton Pipelines&#xff0c;Tekton 作为 Kubernetes 集群上的扩展安装和运行&#xff0c;包含一组 Kubernetes 自定义资源&#xff0c;这些资源定义了您可以为…

Vue表格中鼠标移入移出input显示隐藏 ,有输入值不再隐藏

Vue表格中鼠标移入移出input显示隐藏 , 不再隐藏的效果 <el-tableref"table":data"tableDatas"borderstyle"width: 100%":span-method"arraySpanMethod"id"table"row-key"id"cell-mouse-enter"editCell&q…

Tarjan-vDCC,点双连通分量,点双连通分量缩点

前言 双连通分量是无向图中的一个概念&#xff0c;它是指无向图中的一个极大子图&#xff0c;根据限制条件可以分为边双连通分量和点双连通分量&#xff0c;欲了解双连通分量需先了解Tarjan算法&#xff0c;以及割点割边的概念及求解。本篇博客介绍点双连通分量的相关内容。 前…

简单了解一下当前火热的大数据 -- Kylin

神兽麒麟 一、Apache Kylin 是什么&#xff1f;二、Kylin架构结语 一、Apache Kylin 是什么&#xff1f; 由eBay公司中国团队研发&#xff0c;是一个免费开源的OLAP多维数据分析引擎优点 超快的响应速度&#xff0c;亚秒级支持超大数据集&#xff08;PB以上&#xff0c;千亿记…

数字人解决方案——ER-NeRF实时对话数字人模型推理部署带UI交互界面

简介 这个是一个使用ER-NeRF来实现实时对话数字人、口播数字人的整体架构&#xff0c;其中包括了大语言回答模型、语音合成、成生视频流、背景替换等功能&#xff0c;项目对显存的要求很高&#xff0c;想要达到实时推理的效果&#xff0c;建议显存在24G以上。 实时对话数字人 …

关于Python里xlwings库对Excel表格的操作(十六)

这篇小笔记主要记录如何【设置单元格数据的对齐方式】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】&#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在Wps下…

MyBatis——MyBatis的延迟加载

MyBatis的延迟加载&#xff08;一对多查询案例&#xff09; 1.什么是延迟加载&#xff1f; 开启延迟加载后&#xff0c;在真正使用数据的时候才发起级联查询&#xff0c;不用的时候不查询。 2.pojo User类&#xff1a; package com.wt.pojo;import java.io.Serializable; …

Rust中peekable的使用

在 Rust 中&#xff0c;从迭代器中获取&#xff08;也就是“消费”&#xff09;一个元素时&#xff0c;每次调用 next 方法都会“消费”迭代器的一个元素&#xff0c;这意味着此元素被从迭代器中移除并返回给调用者&#xff0c; 一旦一个元素被消费&#xff0c;它就不能再次从同…

Python中的//, /, % 运算符详解与区别

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;//, /, % 是常用的数学运算符&#xff0c;用于执行整除、除法和取余操作。本文将深入探讨这三个运算符的作用、用法以及区别&#xff0c;并通过丰富的示例代码帮助大家更好地理解它们的用…

大数据开发职业介绍

........................................................................................................................................................... 大数据开发转正 ...................................................................................…

只更新软件,座椅为何能获得加热功能?——一文读懂OTA

2020年&#xff0c;特斯拉发布过一次OTA更新&#xff0c;车主可以通过这次系统更新获得座椅加热功能。当时&#xff0c;这则新闻震惊了车圈和所有车主&#xff0c;彼时的大家还没有把汽车当作可以“升级”的智能设备。 如今3年过去了&#xff0c;车主对各家车企的OTA升级早已见…

【三维生成与重建】ZeroRF:Zero Pretraining的快速稀疏视图360°重建

系列文章目录 题目&#xff1a;ZeroRF: Fast Sparse View 360◦ Reconstruction with Zero Pretraining 任务&#xff1a;稀疏重建&#xff1b;拓展&#xff1a;Image to 3D、文本到3D 作者&#xff1a;Ruoxi Shi* Xinyue Wei* Cheng Wang Hao Su &#xff0c;来自UC San Dieg…

PyTorch随机数生成:torch.rand,torch.randn,torch.randind,torch.rand_like

在用PyTorch做深度学习开发过程中&#xff0c;时常用到随机数生成功能&#xff0c;但经常记不住几个随机数生成函数的用法&#xff0c;现在正好有点时间&#xff0c;整理一下。 1. torch.rand() torch.rand(*size, *, generatorNone, outNone, dtypeNone, layouttorch.stride…

VBA_MF系列技术资料1-247

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

C语言操作符详解+运算符优先级表格

目录 前言 一、操作符是什么&#xff1f; 二、操作符的分类 三、算术操作符 四、逻辑操作符 五、比较操作符 六、位操作符 七、赋值操作符 八、其他操作符 九、运算符优先级表格 总结 前言 在编写程序时&#xff0c;最常用到的就是操作符&#xff0c;本文将详细的介绍…

C++ Qt开发:Charts绘图组件概述

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QCharts二维绘图组件的常用方法及灵活运用。 …

Unity自带的NavMesh寻路组件

最近看了一下Unity自带的NavMesh寻路组件&#xff0c;先说一下基本的使用&#xff1a; 首先先把AI Navgation的package包给安装上。 给场景地图添加上NavMeshSurface组件&#xff0c;然后进行烘焙&#xff0c;烘焙出对应的场景地图文件。 给移动物体添加对应的Nav MeshAgent组…