c语言小知识点小计

devtools/2024/12/22 13:07:48/

c语言小知识点小计

1、运算符的优先级

++运算符的优先级是和指针解引用*的优先级相同的,但在代码运行中执行顺序是从后往前的。因此下面代码

int a[10] = {1,2,3,4};
int* arr = a;
printf("%d",*arr++);//访问的值是2
//注意:printf("%d",*a++);这种语法是错误的,因为a是个常量(指针常量),不可更改

2、 strcpy和memcpy的使用

strcpy只用于字符串数组之间的拷贝,因为strcpy是以\0来判断结束的。使用方式如下:

char a[] = {"this is a test!"};
char b[100];
strcpy(b,a);//不像memcpy需要用户确定拷贝的大小,strcpy以'\0'为结束符判断拷贝的结束

memcpy()能够拷贝任意类型的数组,但需要手动确定拷贝的大小

int a[10] = {1,2,3,4,5};
int b[10];
strcpy(b,a,sizeof(a));//memcpy()需要手动确定拷贝数据的大小

3、数组和数组的首地址

由于数组名是一个指针常量,因此指针的指向是不能更改的,也就是说数组名的指向的地址是不能更改的。因此不能有数组名++的操作如下图代码:

int a[10] = {1,2,3,4} ;
//a++这种写法是错误的,当需要对数组的元素进行访问时,
//可以用下标或者是重新定义一个指针来对数组进行访问。如下所示:
//方法一
for (int i = 0;i<10;i++)
{
printf("数组中的元素是%d",a[i]);
}
//方法二
int *arr = a;
for(int i = 0;i<10;i++)
{
printf("数组中的元素是%d"*arr+i)
}

4、sizeof()的使用

sizeof可以获取当前变量的大小,如下面示例所见:

int  arr[10] = {1,2,3,4};
pirnft("数组的大小是%d"sizeof(a))//获取的是10个int数据占据的空间大小
printf("数组指针的大小是%d"sizeof(&a);//获取的是指针的大小

5、指向常量和常量指针

所谓的常量指针是指常量的值不能通过指针来修改,但指针的指向是可以修改的;
所谓的指针常量是指指针的指向不可修改,在第一次绑定赋值后就不能在去绑定其他变量了。示例如下:

//指针常量int b1 = 10;int *const ddd = &b1; // 指针常量,指针的指向不能更改,需在初始化的时候就赋值//ddd = &c1;错误,因为指针常量的指向是不能修改的*ddd = 20;//语法正确
//常量指针const int *ccc;int c1 = 20;int d1 = 30;ccc = &c1;ccc = &d1;
//    *ccc = 40;语法错误,常量指针不能用过指针来修改变量的值,当可以修改指向cout << "数组的大小是:" << *ccc << endl;

6、不同系统中变量的大小

  • 在32位系统中指针的大小占4字节:32位
  • 在64位系统中指针的大小占8字节:64位
  • char———1字节
    short———2字节
    int————4字节
    long————4字节
    long long——8字节
    float————4字节
    double———8字节

7、c语言中局部变的内存分配

局部变量在函数执行时在栈区分配空间,并在函数执行结束后释放空间。

8、结构体的内存大小与字节对齐

#include<stdio.h>
struct S1
{char a;int b;char c;
};//占12字节
struct S2
{int a;char b;int c;char d;
};//占16字节
int main()
{// sizeof()功能:获取了数据在内存中所占用的存储空间,以字节为单位来计数。printf("%d\n", sizeof(struct S1));printf("%d\n", sizeof(struct S2));return 0;
}
  • 这里可能不好理解在此对其进行解释(假设为32位系统,因此当有跨字节时进行4字节对齐):下图中每个框代表一个字节,由于ch占一个字节因此将其方到第一字节处。由于int 占4字节跨字节了,因此进行4字节对齐。short占2个字节因此放到后面的地址空间。由于char占一个字节没跨字节不用字节对齐。
    在这里插入图片描述
    内存对齐的规则:
    在这里插入图片描述
    在这里插入图片描述

9、数组和指针的区别

  • char arr1[] = “hello”;和char *arr2 = “hello”;两句代码中出现的字符串都存储在静态存储区中。
  • char arr1[] 声明了一个名为 arr1 的字符数组,这个数组的大小正好能够存放字符串 “hello” 加上一个结尾的空字符 ‘\0’。编译器会为 arr1 在栈上分配足够的空间,以存储所有这些字符。
  • 字符串字面量 “hello” 存储在程序的常量区。
    在函数执行时,“hello” 的内容会被复制到新分配的栈空间中,也就是 arr1 数组中。
    这通常是通过一个循环来完成的,每个字符(包括结尾的空字符 ‘\0’)都会从常量区复制到 arr1 的相应位置。
int main()
{
char arr1[] = "hello";
char *arr2 = "hello";
arr1[0] = 'A';//这种写法没有问题,因为arr1是存放在栈上的变量。
printf("%c\r\n",arr1[0]);
//arr2[0] = 'A';这种写法是错误的,因为arr2是指向静态存储区的一个常量指针,不能用过指针来修改值,而且“hello”存放在静态存储区,里面的值就是不能进行修改的
printf("%c\r\n",arr2[0]);
}

http://www.ppmy.cn/devtools/90452.html

相关文章

Mybatis-plus笔记

前言&#xff1a; 这一篇的标题是Mybatis-plus笔记&#xff0c;不会再去分析Mybatis-plus中的每一个方法&#xff0c;就单纯的从下面四个方面介绍一下 1&#xff1a;介绍一下概念&#xff08;依赖&#xff0c;基本的使用&#xff09; 2&#xff1a;Mybatis-plus的条件构造器 3…

【游戏引擎之路】登神长阶(九)——《3D游戏编程大师技巧》:我想成为游戏之神!

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…

【MSYS】Windows Terminal 集成

Windows Terminal 集成 MSYS2安装在默认位置C:\msys64打开Windows Terminal打开JSON配置文件文件。 添加如下配置&#xff1a; "profiles": {"defaults": {},"list": [{"guid": "{71160544-14d8-4194-af25-d05feeac7233}"…

计算机网络基础 - 计算机网络和因特网(2)

计算机网络基础 计算机网络和因特网Internet 结构和 ISP分组延时、丢失和吞吐量四种分组延时分组丢失吞吐量 协议层次及其服务模型概念数据单元&#xff08;DU&#xff09;协议栈TCP/IP 协议各层次的协议数据单元IOS/OSI 参考模型 计算机网络和因特网的历史早期计算机网路&…

通用前端的学习

通用前端的概念 通用前端的概念是我自创的&#xff0c;也是我多年开发全栈时的个人理解&#xff0c;结合自己对各种语言的比较&#xff0c;发现前端都具有几个特征&#xff0c;而这几个特征&#xff0c;很多人只能用具体的表象来描述&#xff0c;比如用安卓方式来说明&#xf…

nodejs流读取二进制文件

创建可读流 首先&#xff0c;我们使用 fs.createReadStream 方法创建一个指向二进制文件的可读流。这个方法接收一个文件路径作为参数&#xff0c;并返回一个 ReadStream 对象。 const readStream fs.createReadStream(example.bin);这行代码会打开 example.bin 文件&#x…

光学知识 | 什么是共封装光学?

共封装光学&#xff08;CPO&#xff09;是一种旨在通过将通信所需的重要元件&#xff08;即光学及电子元件&#xff09;更紧密地结合在一起&#xff0c;解决当今数据密集网络中日益增长的带宽密度、通信时延、铜线传输距离以及电源效率挑战的方案。 行业目前采用了光互连输入输…

代理模式学习

代理模式 代理模式是常用的java设计模式&#xff0c;他的特征是代理类与委托类有同样的接口&#xff0c;代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类&#xff0c;以及事后处理消息等。代理类与委托类之间通常会存在关联关系&#xff0c;一个代理类的对象…