朝花夕拾 · C语言 | 数组篇

手把手教你排查libstdc++.so.6版本问题:从GLIBCXX缺失到完美解决 本文深入解析Linux系统中常见的GLIBCXX版本缺失问题,以`ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.29' not found`为例,从动态链接原理入手,提供使用`strings`和`find`命令的诊断方法,并详细对比了四种解决方案的优缺点。文章重点推荐通过设置`LD_LIBRARY_PATH`或更新系统库的安全策略,并最终建议使用Docker容器化技术实现环境依赖的根治与统一管理。 阅读详情

一.数组基础

1.数组定义

数组一般形式:类型说明符 数组名 [常量或常量表达式];
类型说明符:基本数据类型、构造数据类型(不能是void类型)。说明数组中保存的数据的数据类型。

数组名:遵循标识符的命名规则。

常量或常量表达式:数组中可以保存的元素的个数。
int a[10];                       

sizeof (a);                      //40字节

char str[32];                  //32字节

float array[5];                //20字节

注意:

常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的

    int n;                    //n为随机值
    int a[n];    
    scanf("%d",&n);          //在程序中临时输人数组的大小 
    ❌

但在创建数组之前对变量赋值是可以的

    int n;
    scanf("%d",&n);          //在程序中临时输人数组的大小
    int a[n];   
    ✔                        //C89 / C90	❌ 不允许
                             //C99	✅ 允许

2.数组访问

数组必须先定义,然后使用。C语言规定只能逐个引用数组元素而不能一次引用整个数组。
下标可以是整型常量或整型表达式。例如:
a[0]=a[5]+a[7]-a[2* 3]
注意:定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“[下标]”的区别,例如:
 


    a[0]=a[5]+a[7]-a[2* 3]
    int a[10];                //定义数组长度为10
    t=a[6];                   //引用a数组中序号为6的元素。此时6不代表数组长度
    

数组定义时只能用常量,但访问时可以使用变量访问(应以整型为结果访问)

3.数组初始化

对数组元素的初始化可以用以下方法实现。

(1)在定义数组时对数组元素赋予初值。例如:

    int a[10]={0,1,2,3,4,5,6,7,8,9};

将数组元素的初值依次放在一对花括号内。

(2)可以只给一部分元素赋值。例如:

    int a[10]={0,1,2,3,4};

定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0

(3)如果想使一个数组中全部元素值为0,可以写成:

    int a[10]= {0,0,0,0,0,0,0,0,0,0};或int a[10]={0};

    不能写成int a[10]={0*10};

(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长

    int a[5]={1,2,3,4,5};可以写成int a[]={1,2,3,4,5};

在第二种写法中,花括号中有5个数,系统就会据此自动定义a数组的长度为5。但若数组长度与提供初值的个数不相同,则数组长度不能省略。例如,想定义数组长度为10,就不能省略数组长度的定义,而必须写成:
int a[10]={1,2,3,4,5};
只初始化前5个元素,后5个元素为0。

(5)数组定义时,若int a[],没指定数组大小,则需要初始化;数组定义若不进行初始化,则赋随机值。

4.数组存储

数组的存储形式
单一性:数组中的元素,每个元素的数据类型都是一致。
有序性:数组中的元素按照a[0]-a[n]的顺序进行存储。
连续性:数组在内存中选取连续内存空间存储。

数组越界:
1.初始化数组时,初始化的元素个数超出了数组本身的元素个数。
2.访问数组元素时,[]中的下标超出了数组元素的访问范围。

注意当使用sizeof时数组越界编译器并不会报错,sizeof 是编译时运算符,它计算的是表达式或类型的字节大小,而不会对表达式进行求值(即不会真正执行该表达式)。因此,即使数组长度为 10,使用 sizeof(a[10]) 也不会报错。

5.数组排序(选择、冒泡、插入排序)

1)选择排序

基本思想是:每一趟(如第i趟)在后面n-i+1(i=1,2,...,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只剩下1个,就不用再选。

简单选择排序不断重复地选择待排序元素中最小的一个元素,当前处于第几轮就将该元素与
第几个位置上的元素交换位置,直至所有元素完成排序。

        例如,第一轮将最小的元素与第一个位置上(arr[0])的元素交换位置,第二轮将第二小的元素与第二个位置上的元素交换位置,不断重复上述过程,直到所有元素都已有序。具体步骤如下:
(1)从待排序序列中,找到关键字最小的元素;
(2)将该元素与待排序序列中的第一个元素交换位置(初始时,有序序列中没有元素);
(3)对于余下的n-1个元素,重复上述两个步骤。
对于给定的待排序关键字序列(25,20,99,16,11,14,22,25,42,17),使用简单选择排序的过程

流程如下图所示:

简单选择排序算法实现代码如下:


         for(int i=0;i<len-1;i++)
        {
            for(int j=i+1;j<len;j++)
            {    if( arr[i]>arr[j])
                    {
                        tmp=arr[i];
                        arr[i]=arr[j];
                        arr[j]=tmp;
                    }
            }
        }

也可采用如下方式:其中swap为封装交换两数的函数;

由于采用双重循环,故其时间复杂度为O(n*n);空间复杂度没有额外开销,为O(1);同时该算法不具备稳定性,因为其在内层循环中当遇到两数相同时并不会进行替换,而会继续向后比较,当遇到满足条件的值时会进行替换,从而越过中间相同的数,改变了两数的顺序

2)冒泡排序

基本思想:从后往前(或从前往后)两两比较相邻元素的值,若为逆序(A[i-1]>A[i]),则交换它们,直到序列比较完。我们称它为第一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置(或将最大的元素交换到待排序列的最后一个位置),关键字最小的元素如气泡一般逐渐往上“漂浮”至“水面”(或关键字最大的元素如石头一般下沉至水底)。下一趟冒泡时,前一趟确定的最小元素不再参与比较,每趟冒泡的结果是把序列中的最小元素(或最大元素)放到了序列的最终位置,这样最多做n-1趟冒泡就能把所有元素排好序。

流程图如下所示:

冒泡排序算法实现代码如下:

		 for(int i=0;i<len-1;i++)
		 {
			 for(int j=0;j<len-i-1;j++)
			 {
                if( arr[j]>arr[j+1])
                    {
                        tmp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=tmp;
					}
			 }
		 }

书中相比上述代码额外采用了flag标志位用来判断表初始是否有序,并且倒序实现,每次将最小值交换到序列前方,参考上述流程图。

其性能如下:

3)插入排序

基本思想:假设待排序序列存放在数组arr[0,...,n-1]中(temp代表当前待排序元素),算法步骤如n-1个元素无序。排序过程的插入操作主要分为两部分:
(1)将数组中的数据分成有序和无序两个部分。初始状态下,第1个元素(arr[0])有序,后
(2)循环n-1次,依次将后n-1个元素按关键字有序插入有序序列中的合适位置上。
1有序序列中的元素从后往前地与当前待排序的元素比较,寻找其插入位置p;
2将有序序列中位置p及其之后的元素统一后移1位,然后将当前待插入元素插入目标位置
p。需要注意的是,在算法的实现上,一般是在比较的同时移动数据元素。

流程图如下:

插入排序算法实现代码如下:

性能如下:

6.折半查找

折半查找也称二分查找,是一种在有序数组中查找某一特定数据元素的查找算法。

基本思想:
(1)从当前表的中间元素开始查找,如果中间元素刚好是要查找的数据元素,则查找成功(初
始时刻的当前表是整个数组)。
(2)如果要查找的元素大于(或小于)中间元素,则在数组大于(或小于)中间元素的那一半
子表中查找,在子表中从步骤(1)重新查找。
(3)如果在当前数组为空,则代表查找失败。
折半查找算法的每一次比较都使查找范围缩小一半,该算法对于待查找的列表有两个要求:
(1)查找表必须支持随机查找,为此必须采用顺序存储结构;
(2)查找表内元素必须按关键字大小有序排列。

流程图如下:

折半查找算法实现代码如下:

         int low=0,mid=0,high=len-1;
			while(low<=high)
			{
				mid=(low+high)/2;
				if(num>arr[mid])
					low=mid+1;
				else if(num<arr[mid])
					high=mid-1;
				else
				{
					printf("%d\n",arr[mid]);
					return 0;
				}
			}
			printf("not find\n");

此外,因为折半查找需要方便地定位查找区域,所以它要求线性表必须具有随机存取的特性。因此,该查找法仅适合于顺序存储结构,不适合于链式存储结构,且要求元素按关键字有序排列。

二.字符数组

1.字符型数组定义

char 数组名 [常量];

数组名:标识符命名规则

char str[32];--->sizeof(str)--->32字节

2.字符型数组元素访问

数组名[下标]:

str[0]; ---->char

注意:下标避免数组越界。

3.字符型数组初始化

局部初始化:

    char str[32] = {'h', 'e', 'l', 'l', 'o'};
    char str[32] =  {"hello"};                //字符串初始化
    char str[32] = "hello";
    char str[32] ={0};        //数字0即ASCII为0,而非字符0

没有初始化的部分,默认存储0('\0'字符)

全部初始化:

    char str[5] ={'h','e','l,'l,'o'};

    char str[] = {'h','e','l','l','o'}; ----->5字节

    char str[] =  {"hello"};            ------>6字节
==
    char str[] = "hello";

    char str[5]="good!";	5 字节	"good!" 无结束符(越界)	❌ 错误


当以字符串初始化时,[]常量被省略时,将来数组空间按照初始化后的字符个数去确定,额外增加‘0'字符的存储位置

4.字符型数组输入输出

输入:

1.scanf

    scanf("%s",str);
只能输入不带空格,tab与enter的字符,否则停止

2.gets()

输出:

1.以遍历的方式输出

    for (i=0;str[i]!='\0';++i)
    {
        printf("%c", str[i]);
    }

2.以字符串方式输出

    printf("%s\n",str);

3.puts输出

    puts(str);//自动换行

5.字符型数组相关函数

strlen(str):计算字符串的长度(字符型数组中有效字符个数,不包含'\0')

其一般形式为:
strlen(字符数组)。它是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括'\0'在内)。例如:

char str[10]={"China"};

printf("%d",strlen(str));

输出结果不是10,也不是6,而是5。

 sizeof(str):求字符型数组在内存中所占的字节数(和空间开辟时大小有关)。

  	    char str1[]={"hol"};
        printf("%ld\n",strlen(str1));   //3
		printf("%ld\n",sizeof(str1));   //4
    注意,strlen只能读取以\0为结尾的字符串,若定义char str1[]={'q','t'}此类,则不会输出2,而是

会继续向t后面的内存查找,直到找到以\0为结尾的字符位置;而若定义char str1[]={'q','t','\0'}则会

输出2。

strcpy(str1,str2):字符串拷贝

其一般形式为:strcpy(字符数组1,字符串2)
strcpy是stringcopy(字符串复制)的简写。它是“字符串复制函数”,作用是将字符串2复制到字符数组1中去。

注意:

(1)字符数组1必须定义得足够大,以便容纳被复制的宇符串。字符数组1的长度不应小于字符串2的长度。
(2)“字符数组1”必须写成数组名形式(如strl),“字符串2”可以是字符数组名,也可以是一个字符串常量。例如:strcpy(strl,"China")。
(3)如果在复制前未对strl数组赋值,则strl各字节中的内容是无法预知的,复制时将str2中的字符串和其后的’0'一起复制到字符数组1中,取代字符数组1中的前面字符,最后几个字符并不一定是斜杠零,而是strl中原有的字节的内容。

strncpy(str1,str2,n)将str2的前n个字符复制到str1中替换,要注意替换的字符长度不应超过str1的大小。

strcat(str1,str2):字符串拼接

其一般形式为:strcat(字符数组1,字符数组2)
strcat是String Catenate(字符串连接)的缩写。其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值即字符数组1的地址。

strncat(str1,str2,n)将str2的前n个字符拼接到str1末尾。

strcmp(str1,str2):字符串比较

返回int型数据,若str1>str2,返回大于0的值;若str1==str2,返回0;;若str1<str2,返回小于零的值。

同样的,strncmp(str1,str2,n)比较str1和str2前n个字符大小,返回结果同上

6.数字在字符串中存储

char str[] = "12345";
int num = str;            // 错误:str 是地址(指针),不是数值
int sum = str[0] + str[1]; // 结果是 49 + 50 = 99(不是 1+2=3)

“12345" 存的是 49,50,51,52,53 的二进制值;只有当用 %s 或调用 strlen 时,编译器才会按照 ASCII 标准把这串字节"翻译"成眼中的数字图案;而数学上的整数 12345,在底层是完全不同的另一串二进制码(0x3039,即十进制的 12345)。两者在物理层面不是同一个东西。

既然底层存的是 ASCII 码,那 C 语言是如何实现"把字符串转为整数"的呢?这正是标准库函数 atoi("12345") 或 scanf 在底层做的事:

  1. 读取 '1' (49),减去 '0' (48),得到整数 1。

  2. 计算:1 * 10 + ( '2' - 48 ) = 12。

  3. 计算:12 * 10 + ( '3' - 48 ) = 123。

  4. 如此循环,直到遇到 \0 停止,最后在内存中生成一个新的二进制数 0x3039(即十进制的 12345)。


三.二维数组的定义与引用

1.二维数组定义

二维数组定义的一般形式为:

类型说明符 数组名[常量表达式][常量表达式];

例如:float a[3][4];定义a为3X4(3行4列)的数组。

注意,不能写成:float a[3,4];
C语言对二维数组采用这样的定义方式,使得二维数组可被看作是一种特殊的一维数组:它的元素又是一个一维数组。

2.二维数组初始化

1.全部初始化

1)分行给二维数组赋初值。例如:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

2)可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。例如:
 

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

注意,在二维数组有初始化值的情况下,可以省略行号,但不能省略列号;当没赋初值时,行号与列号都应明确。

2.局部初始化

1)可以对部分元素赋初值。例如:
 

int a[3][4]={{1},{5},{9}};

它的作用是只对各行第1列(即序号为0的列)的元素赋初值,其余元素值自动为0。

2)在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。例如:

int a[][4]={{0,0,3},{},{0,10}};

表示三行四列的数组,没有赋值的数均为0

3)当初始化未确定行号时,会根据数值位自动计算行号,例如:

int a[][4]={1,2,3,4,5,6,7,8,9};

会被默认为三行四列,且第三行为元素为9 0 0 0。

3.初始化为0

1)全部初始化为0

int a[3][4]={0};

2)

int a[][4]={0};//默认为一行四列的数组

3.二维数组访问

    int x=sizeof(arr)/sizeof(arr[0]);       //行号
	int y=sizeof(arr[0])/sizeof(arr[0][0]); //列号
    for(int i=0;i<x;i++)
	{
		for(int j=0;j<y;j++)
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}

4.二维字符型数组

二维字符型数组用于保存多个字符串,可全部初始化也可局部初始化,未赋值的字节空间默认为'\0'

char str[3][128]={"hello","world"};

可使用二维字符型数组配合字符型数组相关函数实现比较多个字符串的大小,如:

	char str[3][128]={0};
	for(int i=0;i<3;i++)
	{
		gets(str[i]);
	}
	char max[128]={0};
	strcpy(max,str[0]);
	for(int i=1;i<4;i++)
	{
		if(strcmp(str[i],max)>0)
		strcpy(max,str[i]);
	}
	    puts(max);

手把手教你用STM32单片机DIY一个简易PLC(附完整电路图与PCB文件) 本文详细介绍了如何利用STM32单片机DIY一个简易PLC控制器,涵盖硬件设计、电路图解析、PCB布局优化及固件框架实现。通过完整的电路图和PCB文件,帮助读者从元器件选型到工业级优化,逐步构建可靠的PLC系统,特别适合工业自动化爱好者和学习者实践。 阅读详情

相关推荐

MT6826SGT-STD-R绝对值编码器深度解析:精准控制+灵活编程

本文详细介绍MT品牌的高性能绝对值编码器——MT6826SGT-STD-R。:区别于传统增量式编码器,绝对值输出无需掉电归零,开机即获准确位置数据。的核心优势,结合应用场景与选型指南,为工程师提供一站式解决方案参考。MT6826SGT-STD-R是一款专为工业级精密控制设计的。该设备广泛应用于伺服系统、机器人关节校准、自动化产线等领域。:15bit分辨率实现细腻的位置反馈;:通过专用编写器可自定义多项关键参数;:优化电路设计,适应复杂电磁环境。

2501_93066786的博客 679

朝花夕拾 · C语言 | 指针篇

基类型 *变量名;基类型:该指针指向的空间存储的数据的数据类型:int、char、float 、double 、void、构造数据类型* : 类型说明符,说明后面的变量是一个指针变量名:遵循标识符的命名规则p开头指针变量中保存的地址,是该数据类型的首地址。

Vvc_Python的博客 409

Fast-LIO2代码解析 古月居

FAST-LIO,FAST-LIO2与FASTER-LIO - 古月居FAST-LIO2代码解析(一) - 古月居FAST-LIO2代码解析(二) - 古月居FAST-LIO2代码解析(三) - 古月居FAST-LIO2代码解析(四) - 古月居FAST-LIO2代码解析(五) - 古月居FAST-LIO2代码解析(六) - 古月居

li4692625的博客 2785

朝花夕拾 · C语言 | 基础篇

你是否曾与C语言初次相遇,许多概念一知半解。如今带你重走来时路,从头梳理语法、指针、内存、结构体等,陪你扫清底层盲区,为嵌入式开发筑牢根基。以此系列博客,记录复盘全过程。

Vvc_Python的博客 390

Java8动态生成SFunction:基于字段名的Lambda表达式实践

本文深入探讨了在Java8中如何基于字段名动态生成SFunction,以解决MyBatis Plus的LambdaQueryWrapper在动态查询场景下的局限性。通过核心原理LambdaMetafactory的解析和手把手的代码实现,展示了如何将字符串字段名转换为类型安全的Lambda表达式,从而实现真正动态、类型安全的查询条件构建与通用数据处理,显著提升代码的灵活性与安全性。

sss66的博客 953

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1007

C语言修炼——数组与函数全析!!!

本篇包含了几乎所有数组与函数所需掌握的基础知识,篇幅较长。初学者需要耐心观看;同时,掌握本篇知识后推荐进入本篇的专栏,阅览《C语言修炼——扫雷游戏?冲冲冲!!!》,并完成项目实操,让自己对知识的掌握更上一层楼,或借此与本篇结合反复回看,弄清不通之处。ret_type fun_name(形式参数) {ret_type是函数返回类型fun_name是函数名( )中的是形式参数{ }中的是函数体我们可以将函数想象成做菜,食材是参数,函数(子程序)的结果是菜。

Meanlong_的博客 2288

等保2.0下可信验证的动态实现与合规实践

本文深入解读等保2.0标准中的“可信验证”要求,并重点探讨其动态实现与合规实践。文章阐述了从可信根、信任链到动态验证的核心概念,拆解了不同安全等级的实施差异,并提供了从硬件选型、软件赋能到平台集成的四步落地指南。通过行业案例与避坑心得,为构建覆盖计算环境、区域边界、通信网络和安全管理中心的全链条可信防御体系提供了实用参考。

d3e4f的博客 828

朝花夕拾 · C语言 | 结构体篇

int num;结构体类型 变量名;int mon;int day;}mydate;

Vvc_Python的博客 357

手把手教你学simulink(32.1)--汽车电动机管理场景示例:基于Simulink的发动机管理系统中的混合动力车辆能量管理优化

本项目旨在设计和实现一个用于混合动力车辆(Hybrid Electric Vehicle, HEV)的能量管理优化系统(Energy Management Optimization System, EMOS)。通过Simulink进行建模和仿真,确保系统的稳定性和性能。该系统采用了先进的控制策略,如模型预测控制(MPC)、模糊逻辑控制、自适应控制等,以优化燃油经济性、减少排放,并提高驾驶体验。

MHD0815的博客 186

人形机器人硬件电路设计入门

人形机器人属于。

blotemj.blog.youkuaiyun.com 229

[朝花夕拾C语言]:指针的进阶学习

指针到底是个啥呢?在指针里面(1.数组 2.数组指针 3.指针数组 4.函数指针 5.函数指针数组) 的基本概念和应用,如何区分!

qq_44838021的博客 223

YOLOv11改进 | 融合改进篇 | 利用尺度统一检测头DynamicHead融合P2增加小目标检测层(让小目标无所遁形)

本文给大家带来的最新改进机制是针对性的改进,针对于小目标检测增加P2层针对于大目标检测增加P6层利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。我们增加P6层是一个较低分辨率但具有更大感受野的特征层。对于大尺寸目标,这意味着模型可以更有效地捕捉到整体的结构信息。在这些的基础上我们配合DynamicHead可以使模型根据不同尺寸的目标动态调整其检测策略,进一步提升模型的精度。

Snu77的博客 3951

朝花夕拾 · C语言 | 函数篇

此外 ,%f 不能接收double型,且双引号里写了什么,在输入时也要相同,所以除了格式控制符之外尽可能少写其他数据。八进制与十六进制也可指定输出域宽,如%8o表示输出八位八进制数,%8x表示输出八位十六进制数;此外,%lo与%lx则可表示以八和十六进制输出long型。在输入整型时,可以使用空格,Tab与Enter隔开两数,除此之外用其他字符则会直接中断输入,舍弃后续读入的数字。域宽输出: 7. %nd 以n位域宽输出,若数据大于n位则以实际位数输出,否则左侧补空。

Vvc_Python的博客 349

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

朝花夕拾 · C语言 | 内存篇

内存管理

Vvc_Python的博客 466

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

朝花夕拾 · C语言 | 预处理命令篇

预处理:展开和#相关的代码:展开头文件、展开宏、处理预处理命令编译:将c语言程序转换成汇编指令。汇编:将汇编指令转换成二进制可执行程序链接:负责链接系统的函数/库函数的实现(链接函数)

Vvc_Python的博客 386

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[C语言朝花夕拾] C语言中的命令行输入参数判断

在C语言中,我们的函数入口经常会有: int main(int argc, char** argv) { ... return 0; } 类似这样的传入参数,这类型的参数是为了,用户在利用命令行调用该程序的时候,能够传入适合的参数去控制程序的特定行为。例如,假如现有程序: #include <stdio.h> int main(int argc, char** argv) { printf("number of arg %d\r\n", argc); int i = 0; for

机器学习杂货铺1号店 1879

朝花夕拾 · C语言 | 多文件篇

4.在对应的头文件中加extern关键字声明,头文件中全局变量只能声明不能初始化,定义应在.c文件。Makefile:管理代码工程的编译和链接,由make工具进行解释,实现一键化工程的编译和链接。依赖文件(生成目标文件所依赖的源文件):main.c sum.c sub.c ......编译规则:gcc main.c sub.c sum.c ( -o a.out)在头文件的声明里,函数默认为extern,编译器会自动加上。2.如果只是在定义该全局变量的文件中使用该全局变量,可以不声明;

Vvc_Python的博客 394

朝花夕拾 · C语言 | 流程控制篇

if,switch,for,while,do while

Vvc_Python的博客 351

朝花夕拾 · C语言 | 位运算篇

<按位左移 按位左移,低位补0 num << n <===> num *2^n。>>按位右移 按位右移动,有符号数高位补符号位:无符号数高位补0。| 按位或 有1则1,全0为0。~按位取反 1取反为0,0取反为1。1010 0010 //低四位置0。& 按位与 全1为1,有0则0。^ 按位异或 相同为0,相异为1。3.两数交换(不使用中间变量)

Vvc_Python的博客 299

朝花夕拾C

偶然见看到这个问题:structure alignment 这些C的问题都是相当基础而且经典的。 然而我在编译的途中,犯了个更加经典的错误,囧~决定重新拾起大一没学好的C,也好好记录下来。 直接拷贝的源代码,就加了一main函数,打印三个struct的size struct X { short s; /* 2 bytes */ /* 2 padding

Make history... 470

朝花夕拾 · C语言 | 调试篇

l 列出原代码。q 退出gdb。r 运行程序。S 跟进函数。1.编译程序:-g选项:允许使用gdb进行调试。gnu提供的Linux下的代码调试工具。b+行号 在指定行打断点。p+变量名 查看变量值。where 定位段错误的位置。1.使用gdb调试逻辑错误;2.使用gdb调试段错误。gdb./可执行程序。

Vvc_Python的博客 164

朝花夕拾C语言:去掉程序中的空格然后输出

将题目中的空格进行去除,然后对所得到的数组进行输出:

qq_44838021的博客 716

【朝花夕拾】C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答2...

= = = 朝花夕拾-C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答2 这一篇主要目标讲多维数组和指针类型。 原理1:C语言中只有一维数组。2维数组可以看成是一维数组的一维数组。多维数组以此类推。 原理1:C语言中只有一维数组,:数组名称后面跟着的第一个数字维度就是数组的真实维度。除此之外,其他的参数则是数组元素的信息描述。 C语言中只有一维数组,而且数组的大...

weixin_30820151的博客 140

朝花夕拾-C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答2...

= = = 朝花夕拾-C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答2 这一篇主要目标讲多维数组和指针类型。   原理1:C语言中只有一维数组。2维数组可以看成是一维数组的一维数组。多维数组以此类推。 原理1:C语言中只有一维数组,:数组名称后面跟着的第一个数字维度就是数组的真实维度。除此之外,其他的参数则是数组元素的信息描述。 C语言中只有一维数组,而且数组的...

fantaxy025025的专栏 308

【朝花夕拾】C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答...

【朝花夕拾】C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答 = = = 选择题(提示:答案只有一个): int *p = 100; 到底是下面哪个呢? 答案A: (int *) p 答案B: int (*p) 答案是B。 一定要分清楚指针定义和变量类型的关系。 指针定义的方式是在普通定义方法的变量名前加*。 普通定义的方式为...

weixin_30840253的博客 131
上一篇: 朝花夕拾 · C语言 | 流程控制篇
下一篇: 朝花夕拾 · C语言 | 指针篇
剑指offer.
博客等级 码龄3年 15粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值