C语言不详细记录

2023-05-16

C记录

      • 1.内存管理
      • 2. 结构体内存对其规则
      • 3. 字符串函数
      • 4. 二维数组
      • 5. const 指针
      • 6. 字符串
      • 7. 图片记录
      • 8. 函数指针

1.内存管理

C语言内存讲解-详说内存分布和heap空间

2. 结构体内存对其规则

C语言结构体对齐规则
C语言-结构体 字节对齐–嵌套–数组
10道经典例题手撕C语言字节问题

#pragma pack(N) 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
如果没有通过宏,那么在32位Linux主机上默认指定对齐值为4,64位的默认对齐值为8,AMR CPU默认指定对齐值为8;

#include <stdio.h>
#include <string.h>


int main() {
    char str1[] = "abcd";
    char str2[] = {'a','b','c','d','\0'};
    char *str3 = "abcd";  //这样的话,*str3就相当于str1[]  str3也就数组名
    //上述三个是相同的,str2最后一个一定要加'\0'
    //str1,str2,str3都可以理解为数组名(也就是数组的首元素地址)
    //str1和str2都可以通过下标的方式改变对应的值
    //str3的方式,是按照常量的方式看待str3的,不能通过下标的方式修改

    /*
     * 一般情况下,数组名表示数组首元素地址
     * 特殊情况:
     *      sizeof(数组名),此时的数组名表示整个数组
     *      &数组名,此时表示整个数组的地址
     */

//    sizeof用来是按照字节数的(实际占用内存长度),字符、字符串、'\0'整形都能计算
//    sizeof(地址)就是等于一个地址类型占用的字节大小,跟指向的类型无关。

//    strlen用来字符数的长度,遇到'\0'就会停止计算长度。只能计算字符数组(以\0结尾)
//    strlen(地址)从这个地址开始计算,一直计算到\0为止。


	//字符串数组
	char week[3][10] = {
		"Monday",
		"Thenday",
		"Wenday"
	};
	
	char *pweek[]{  //char型指针数组
		"Monday",
		"Thenday",
		"Wenday"
	};


    //一维数组
    int a[] = {1,2,3,4,5,6};
    int *p = a;
    printf("%d\n",*(p+1));

    //指针数组
	int x = 1, y = 2, z = 3;
	int* b[3] = { &x,&y,&z };  //每一个元素都是指针的数组
	int** pb = b;   //pb和b可以互换

	for (int i = 0; i < 3; i++) {
		printf("%d\n", **(b + i));
	}

	for (int i = 0; i < 3; i++) {
		printf("%d\n", *(pb[i]));
	}

    //二维数组+数组指针
    int array[3][4]={
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12}
    };
    int (*pa)[4] = array;  //pa和array可以互换

	//pa\array是第一行一维数组的地址
	//pa[0]\array[0]是第一行一维数组的首元素的地址
	//pa[0] pa[1]...可以理解为每一行一维数组的数组名字
	//pa+0  pa+1 ...和上边等价
	/而pa[0]+1 不等于 pa+1

    for (int i = 0;i < 3;i++){
        for (int j = 0; j < 4; j++){
            printf("%d ",*(*(pa+i)+j));
        }
        printf("\n");
    }

    for (int i = 0;i < 3;i++){
        for (int j = 0; j < 4; j++){
            printf("%d ",*(array[i]+j));
        }
        printf("\n");
    }


    return 0;
}

3. 字符串函数

复制字符串
strcpy(str1,str2) str1的位置必须够,但是不检查是否位置够
strncpy(str1,str2,n) 按照n的个数复制字符 该函数不会自己添加’\0’ 如果没有的话,需要自己添加

拼接字符串
strcat(str1,str2) str1的位置必须够,但是不检查是否位置够 该函数不会自己添加’\0’
strncat(str1,str2,n) 按照n的个数拼接字符 该函数自动添加空字符\0

strncat(
  str1, 
  str2, 
  sizeof(str1) - strlen(str1) - 1
);

比较字符
strcmp(str1,str2)
strncmp(str1,str2,n)

字符串拼接
sprintf(),snprintf()

char first[6] = "hello";
char last[6] = "world";
char s[40];   //s接收

sprintf(s, "%s %s", first, last);

4. 二维数组

#include<stdio.h>

int main(void)
{
	int array[3][4] = {
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12}
	};

	for (int i = 0; i < 3; i++)
	{
		printf("%d  %d  %d  %d\n", array[i][0], array[i][1], array[i][2], array[i][3]);
	}

	for (int i = 0; i < 3; i++)
	{
		printf("%p  %p  %p  %p\n", &array[i][0], &array[i][1], &array[i][2], &array[i][3]);
	}

	printf("在理解的时候,[ ]就相当于*解引用;若有[ ]又有&就相当于这两个都没有\n");
	printf("二维数组名字直接使用表示数组指针   若解一层引用表示到具体的某一行数组名\n");

	printf("array:        %p  *array:      %p\n", array, *array);
	printf("array + 1:    %p  *array + 1:  %p\n", array + 1, *array + 1);
	printf("&array[0]:    %p  array[0]:    %p\n", &array[0], array[0]);
	printf("&array[0] + 1:%p  array[0] + 1:%p\n", &array[0] + 1, array[0] + 1);

	int(*p1)[4];
	int(*p2)[4];
	int(*p3)[4];

	p1 = array;     //用指针数组表示二维数组的最佳表示方法
	p2 = *array;    //不会报错,但是逻辑上别扭
	p3 = array[0];  //不会报错,但是逻辑上别扭

	printf("%p  %p  %p\n", p1 + 1, p2 + 1, p3 + 1);
	printf("%p  %p  %p\n", *(p1 + 1) + 2, *(p2 + 1) + 2, *(p3 + 1) + 2);

	int(*p4)[4];
	p4 = array[0] + 1;       //这样虽然不会报错,但是逻辑错误
	printf("%p\n", p4 + 1);  //错误示例

	//正确示范
	p4 = array + 1;
	printf("%p\n", *p4 + 1); //这样的话,逻辑是正确的   

	return 0;
}

5. const 指针

在这里插入图片描述

6. 字符串

#define DMG "I am ueueq"

int main(void)
{
	char str1[] = { 'A','B','C','D','E','\0' };
	char str2[] = "ABCDE";
	char* str3 = "ABCDE";


	//strlen表示的是字符串的实际长度,遇到‘\0’停止,且不包括‘\0’
	//sizeof表示实际占用内存大小,包括'\0'
	printf("strlen:%d  sizeof:%d\n", strlen(str1), sizeof(str1));
	printf("strlen:%d  sizeof:%d\n", strlen(str2), sizeof(str2));

	printf("str2:%p  *str3%p\n", str2, str3);

	str1[1] = 'Z';
	str2[1] = 'Z';
	//	str3[1] = 'Z';   //字面量的字符串定义方法,属于常量定义,不能通过数组下标的方式改变字符串

	puts(str1);
	puts(str2);
	puts(str3);

	//测试新的示例
	//数组与指针定义字符串的不同

	/*
		字面量的定义方式,会将字符串存储在静态存储区(文本);
		若采用数组的定义方式,还会复制一份到到内存地址中,即str所指的位置;并且str所指向的位置不能改变,只能str+1,不能++str
		若采用指针的定义方式,会直接将静态存储区的地址放到strp。可以++strp指向第二个字符;这种方式感觉就是字符指针。
	*/
	/*
		C语言中定义的相同的字符串(字面量方式)。可能只存储一份。
	*/

	char str[] = DMG;
	char* strp = DMG;

	printf("str[]:%p  *strp:%p\n", str, strp);
	printf("DMG:%p\n", DMG);

	const int* pt;
	int const* pz;

	int* const pl;

	return 0;
}

7. 图片记录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8. 函数指针

	void func(int a, int b); //函数声明
	void (*pf)(int, int);   //函数指针定义
	pf = func;  //赋值
	pf(1, 2);   //函数指针使用

	int func(char*, int);
	int (*pf)(char*, int);
	pf = func;
	pf('0', 1);

	//函数指针数组
	int func(char*);
	int (*pf[10])(char*);  //表示每一个元素都是指向func函数的函数指针
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言不详细记录 的相关文章

随机推荐

  • PS 开启GPU加速图片处理

    还认为你的电脑的速度效果比不上苹果吗 xff1f 还在嫌电脑渲染速度慢吗 xff1f 试一下 xff0c 电脑开启GPU硬件加速吧 xff01 只要有独显轻松加速 xff08 毕竟苹果笔记本要配独显电脑的价格基本上在15000以上 xff0
  • 管道鸟cortex-M4(TM4C1294)

    看到满屏的贪吃蛇 xff0c 我也来开源一个Ti开发板 xff08 TM4C1294 xff09 的游戏 将简化版的管道鸟 xff0c 根据自己玩的经历 xff0c 在cortexm4开发板上重新撸了一边 xff0c 设计思路 xff1a
  • C#连接MYSQL数据库并进行查询

    之前用MFC开发结果界面太难看被pass了 要求用C 重新来开发 gt lt 不过终于摆脱VC6 0的蛋疼操作了Y 先来连接数据库 xff08 1 xff09 用c 连接MYSQL数据库需要用到mysql connector net xff
  • binascii.Error: Incorrect padding 报错解决

    输入的base64编码字符串必须符合base64的padding规则 当原数据长度不是3的整数倍时 如果最后剩下两个输入数据 xff0c 在编码结果后加1个 61 xff1b 如果最后剩下一个输入数据 xff0c 编码结果后加2个 61 x
  • 通过过滤器链了解spring security + oauth2实现单点登录的过程

    一 系统 注意部署在同一机器 xff08 localhost xff09 上的三个应用 xff0c 为了防止存放在cookie中的JSESSIONID不被覆盖 xff0c 需要设置不同的path xff0c 可以在配置文件中指定不同的上下文
  • jetson tx2开箱上电

    期待已久的jetson tx2终于到了 xff0c 来做一个开箱 jetson tx2是英伟达的第三代GPU嵌入式开发板 前两代分别是jetson tk1和jetson tx1 jetson tk1 xff1a 绿色的版板子接口丰富 jet
  • Jetson tx2刷机过程中的坑

    暑假各种事忙得差不多后 xff0c 终于有时间拿出早就申请到的tx2 xff0c 开始刷机教程 xff0c 这两天几乎踩边了所有的坑 第一个坑 xff0c 虚拟机 一般在安装VMware虚拟机时 xff0c 建议的安装空间20GB xff0
  • python词云实现

    python的一个蛮酷炫的功能是可以轻松地实现词云 github上有关于这个项目的开源代码 xff1a https github com amueller word cloud 注意跑例程时要删除里面的wordcloud文件夹 词云的功能有
  • docker中accessTokens拉取私有git仓库

    背景 当需要git clone拉取私有库时 xff0c 传统的做法为将本机的ssh配置到gitlab中 但在docker中执行程序时需要拉取私有库 xff0c 此时无法为每个docker容器配置ssh 网上的一种方案为 xff0c 将配置好
  • Docker世界 -- 进阶篇(入门)

    一 Docker Compose 1 1 Docker Compose 介绍 1 1 1 简介 xff1a 传统的 docker 服务 xff0c 我们一般通过编写 Dockerfile 文件 xff0c 通过 build 命令创建一个镜像
  • 树莓派pico CMake工程 直接添加 .c .h文件

    假设工程名test1 xff0c 带main 的源代码文件 main c xff0c 要往工程里添加oled c oled h之类的源代码 直接添加为可执行文件 xff1a 编辑工程根目录的 CmakeLists txt add execu
  • 张量的通俗理解

    1 关于张量的四种定义 张量 在不同的运用场景下有不同的定义 xff08 1 xff09 张量是多维数组 xff0c 这个定义常见于各种人工智能软件 听起来还好理解 xff08 2 xff09 张量是某种几何对象 xff0c 不会随着坐标系
  • 如何搭建node_exporter

    如何搭建node exporter 1 观看条件 1 假设你已经看过上一篇文章 如何搭建普罗米修斯 Prometheus 2 假设你已经会搭建普罗米修斯 xff08 promethus xff09 3 上面两个假设 xff0c 只要满足一个
  • python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,···,参数n)区别

    前言 这两种初始化形式 xff0c 就类似于C 43 43 类中的构造函数 形式1 def init self span class token keyword class span span class token class name
  • Go语言操作grpc详细使用

    Go语言操作grpc详细使用 零 参考链接一 protobuf的详细使用二 grpc与protobuf的go文件的生成1 安装两个插件2 写proto文件3 编译proto文件 xff0c 生成go文件 三 grpc的详细使用1 一元RPC
  • Steghide使用教程及其密码爆破

    Steghide使用教程及其密码爆破 工具介绍 Steghide是一款开源的隐写术软件 xff0c 它可以让你在一张图片或者音频文件中隐藏你的秘密信息 xff0c 而且你不会注意到图片或音频文件发生了任何的改变 而且 xff0c 你的秘密文
  • 一道Gloang并发、锁的面试题,你会吗?

    Gloang并发 锁的面试题 1 题目描述2 问题分析2 1问题一2 2问题二2 3问题三2 4问题四2 5问题五 3 问题解决方法4 代码实现4 1 map前后加锁的方式4 2 sync map解决方式 1 题目描述 源地址 xff1a
  • 阿里云、腾讯云centos7安装mysql

    阿里云 腾讯云centos7安装mysql 1 下载2 解压与准备3 安装4 配置4 1配置数据库4 2查看默认密码4 3启动mysql4 4设置密码 5 开启远程登录5 1开放3306端口5 2开启远程登录6 参考链接 1 下载 镜像网站
  • go语言gin、net/http的优雅关机

    gin net http的优雅关机 什么是优雅关机 xff1f 优雅关机的实现参考链接 什么是优雅关机 xff1f http server运行过程中 xff0c 若进程被关闭 xff0c 那么正在处理的请求可能只被处理了一半就停止了 xff
  • C语言不详细记录

    C记录 1 内存管理2 结构体内存对其规则3 字符串函数4 二维数组5 const 指针6 字符串7 图片记录8 函数指针 1 内存管理 C语言内存讲解 详说内存分布和heap空间 2 结构体内存对其规则 C语言结构体对齐规则 C语言 结构