C learning_5

简介: C learning_5

数组相关问题


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3 };
  //数组如果初始化的话,可以不指定大小,会根据初始化的内容自动确定大小
  /*
  c99标准之前数组的大小不能是变量的
  但是在c99标准之后引入了变长数组的概念
  这时允许数组的大小时变量,但是不可以初始化
  */
  return 0;
}


C99新增标准


       C99是C语言的一个新标准,于1999年发布。相对于之前的C89标准,C99引入了一些新特性,包括:


1. 布尔类型:C99标准引入了bool类型,可以用true和false来表示布尔值,这是一种非常方便的数据类型,可以简化代码的编写。

2. 复合字面量:C99标准允许使用复合字面量,即同时初始化多个类型不同的值,使用花括号来表示。这种特性可以简化代码的编写,让代码更加紧凑。

3. 变长数组:C99允许使用变长数组,即数组长度可以在运行时动态地分配。这种特性可以提高程序的灵活性,让程序更加适应不同的数据需求。

4. for循环的扩展:C99允许在for循环中声明循环变量,这种特性可以简化代码的编写,提高代码的可读性。

5. 更多的注释方式:C99允许使用//的注释方式,这种注释方式可以在行末添加注释,方便代码的编写和阅读。


总之,C99标准引入了一些新的特性,包括布尔类型、复合字面量、变长数组、for循环的扩展、更多的注释方式等,使C语言编程更加方便、灵活和高效。


两个数的最大值


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Max(int x, int y)
{
  return x > y ? x : y;
}
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  //求较大值
  int m = Max(a, b);
  printf("%d\n", m);
  return 0;
}


内存


内存是计算机中一种临时数据存储器,它通过电子元件存储数据,可以快速对数据进行读写操作,是计算机系统中至关重要的组成部分之一。


内存可以分为静态内存(SRAM)和动态内存(DRAM)两种类型。静态内存存储器中的数据可以持续保存,但其价格较高,容量较小。而动态内存中的数据需要每隔一定时间进行刷新,否则数据会丢失,但其价格比静态内存低,容量更大。


内存的内部结构是非常复杂的,一般来说,内存由若干个内存芯片构成,其数量和容量决定了整个内存的大小。电脑内存的单位是字节(Byte),1Byte等于8个二进制位(bit)。


内存的速度也是很重要的,一般用内存频率(MHz或MT/s)来表示。高速内存可以提供更高的读写速度,从而使计算机系统更加高效运行。内存的使用方式以及内存容量也决定了计算机的运行效率。操作系统和程序可以在内存中运行,内存过小容易导致计算机变慢或者系统崩溃,


因此,提高内存容量可以让计算机更好地处理更多任务和运行更复杂的程序。


指针


指针是一种变量类型,它存储内存地址,即指向内存中某个具体位置的数字。指针可以指向任何数据类型的变量,包括基本数据类型、数组、结构体等。


指针变量本身也有一个地址,而指向指针变量的指针称为二级指针或多级指针,以此类推。


指针的使用可以分为四种基本操作:定义指针变量、为指针变量赋值、通过指针访问所指向的值和使用指针访问数组元素。


指针的定义需要指定指针所指向的数据类型,即通过“* ”符号指定。

例如,定义一个指向整型变量的指针:

int* p;


这里的“* ”符号表示p是一个指针变量,指向一个整型变量。


指针的赋值可以通过给指针变量赋值一个内存地址来实现。

例如,将p指向一个整型变量x的地址:

int x = 10; p = &x;


这里的& 符号表示取地址,即将x的地址赋值给指针变量p。通过指针访问所指向的值可以使用“* ”符号。

例如,通过p指针访问x的值:

int y = *p;

这里的“* ”符号表示解引用,即获取指针指向的内存地址中存储的数据。


使用指针访问数组元素可以通过指针和下标的组合实现。

例如,定义一个指向整型数组的指针:

```int arr[3] = { 1, 2, 3 }; int* pArr = arr; ```


这里的pArr指向整型数组arr的第一个元素。我们可以使用指针和下标的组合访问数组元素:


int x = *(pArr + 1); // 获取arr[1]的值,即2


这里的“+1”表示增加一个整型变量的大小,即指向arr[1]的地址。


指针的使用需要注意一些安全性问题,例如指针越界访问、未初始化指针的使用等,这些问题可能导致程序出现运行时错误,甚至影响系统的稳定性。因此,程序员在使用指针时需要注意使用方式和注意事项。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
  int a = 15;
  //a的地址:0x000000155CCFFA74
  //a在内存中的数据显示:0f 00 00 00 
  //a是int类型
  //所以向内存申请了4个字节的空间
  //用来存放15这个数值
  //虽然a占有四个字节,但是当我们&地址的时候\
  拿到的是4个字节中第一个字节的地址
  int* p = &a;
  //p是一个指针变量,指向a的地址
  *p;//获取a变量的值
  //指针变量大小
  /*
    指针变量是用来存放地址的
    32位机器上:地址是32个二进制位,这个地址要存储的话要4个字节
    所以在32位机器上,指针变量的大小是4个字节
    64位机器上:地址是64个二进制位,这个地址要存储的话要8个字节
    所以在64位机器上,指针变量的大小是8个字节
  */
  printf("%d\n", sizeof(p));
  printf("%d\n", sizeof(int*));
  return 0;
}


结构体


结构体是一种自定义的数据类型,它可以包含多个不同类型的成员,每个成员可以是基本数据类型、指针、数组、结构体等类型。


结构体通常用于将多个相关的数据项打包在一起,以便于传递和处理。结构体的定义由结构体名称和结构体成员组成。

例如:

struct person {    

char name[20];    

int age;    

float height;

};


上述代码定义了一个名为 `person` 的结构体,它包含三个成员,分别是名字、年龄和身高。


我们可以使用结构体变量来存储和访问结构体中的成员。

例如:

struct person p1;

strcpy(p1.name, "John");

p1.age = 20;

p1.height = 1.8;


这个代码片段中,我们定义了一个 `person` 类型的结构体变量 `p1`,并向其中的成员赋值。我们使用 `strcpy` 函数将字符串 "John" 复制到 `p1` 的 `name` 成员中,然后将 `p1` 的 `age` 成员赋值为 20,将 `p1` 的 `height` 成员赋值为 1.8。


我们可以使用点操作符 `.` 来访问结构体中的成员。


例如:

printf("%s is %d years old and %.2f meters tall\n", p1.name, p1.age, p1.height);


这个代码片段中,我们使用 `printf` 函数输出 `p1` 的成员值。我们使用点操作符来分别访问 `p1` 的 `name`、`age` 和 `height` 成员,并将它们作为参数传递给 `printf` 函数。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct S
{
  char name[20];
  int age;
  float score;
};
void print1(struct S t)//
{
  printf("%s %d %lf", t.name, t.age, t.score);
}
void print2(struct S* ps)
{
  printf("%s %d %lf", (*ps).name, (*ps).age, (*ps).score);
  printf("%s %d %lf", ps->name, ps->age, ps->score);
}
int main()
{
  struct S s = { "张三",20,88.5f };
  print1(s);
  print2(&s);
  return 0;
}
相关文章
|
Java Linux 开发工具
Linux安装JDK1.8
Linux安装JDK1.8
370 0
|
存储 前端开发 机器人
通过4个任务比较LangChain和LlamaIndex
我们在本地使用大模型的时候,尤其是构建RAG应用的时候,一般会有2个成熟的框架可以使用
2695 2
|
10月前
|
存储 大数据 数据处理
大数据环境下的性能优化策略
大数据环境下的性能优化策略
356 2
|
监控 数据可视化 BI
基于Dataphin+Flink构建期货交易监察实时应用
新一代证券交易监察系统利用大数据和实时计算技术强化风险控制、交易数据处理、识别异常交易等能力。通过Dataphin与Flink结合,构建期货交易监察实时数据应用;借助QuickBI用于打造实时看板和预警体系,实现期货交易监察的实时可视化分析和自动化预警。
650 0
|
XML 设计模式 安全
【Spring框架四】——Spring AOP 注解实现和xml方式实现1
【Spring框架四】——Spring AOP 注解实现和xml方式实现
229 0
|
数据采集 人工智能 监控
客户管理和运营太难了?瓴羊×阿里云上的Salesforce给出更符合中国企业体质的解法
在数字化时代,消费者行为变化和数据爆炸性增长促使企业转向CRM升级。瓴羊通过与Salesforce合作,推出Quick Service和Quick Audience工具,应对多渠道数据整合与个性化营销的挑战。Quick Audience增强CRM的数据收集和分析,提供精准客户画像,而Quick Service提升客服效率,通过AI增强客服交互。这两款工具预集成于阿里云上的Salesforce,助力企业实现更高效、精准的客户管理和营销。随着新技术发展,AI等工具将在客户管理中发挥更大作用,推动商业模式创新。
224 0
|
Ubuntu
ubuntu下使用ndk编译libevnet
ubuntu下使用ndk编译libevnet
149 1
|
监控 Dubbo 数据可视化
带你读《Apache Dubbo微服务开发从入门到精通》——三、 全链路追踪(4)
带你读《Apache Dubbo微服务开发从入门到精通》——三、 全链路追踪(4)
461 75
|
文字识别 数据可视化 PyTorch
OCR-字符识别笔记
OCR-字符识别笔记
|
存储 运维 监控
值得收藏的常用DELL OpenManage Server Administrator (OMSA) 的命令列表
DELL OpenManage Server Administrator (OMSA) 提供了一套全面的命令行工具,用于戴尔服务器的硬件监控、配置和故障排查。
717 0