当前位置: 首页 > ai >正文

《数据结构笔记一》: 指针、结构体、动态内存分配、算法时间复杂度。

两个变量的值之间进行交换

#include<stdio.h>void swap(int a ,int b){int temp;temp = a;a = b;b = temp;printf("a = %d , b= %d\n"a,b);}int main(int argc, char const *argv[]){int m =5;int n = 10;swap(m,n);printf("m= %d,n = %d\n"m,n);return 0;}

输出结果:

a10 b5

m 5 n10

指针与数组

在C语言中,指针与数组的关系十分密切

通过数组下标完成的操作都可以通过指针完成

一般来说,用指针编写的程序比用数组下标编写的程序执行速度快

例如

#include<stdio.h>int main(int argc ,char const *argv[]){int a[] = {11,12,13,14,15};int *p;p = a;printf( " %p\n ", a);printf(" %p\n ", p);printf(" %d\n ", *p)    return 0;}

输出结果:

0x7ffb2414610

0x7ffb2414610

11

可以看到 取 *p地址输出的是数组的首位元素

那如果想取数组的其他元素呢? 怎么做

看下例子

#include<stdio.h>int main(int argc , char const **argv){int a[] = {11,12,13,14,15};int *p;p = a;//加入一个for循环 普通数组遍历for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++ ){printf( "%d\n", a[i] );}//加入一个for循环 指针遍历数组方式for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++){printf("%d \n"; ****(p + i) ); //给指针加一个整数,实际上是给这个整数和指针数据类型对应字节数的乘积 p = p+14}return 0 ;}

输出结果:

11

12

13

14

15

11

12

13

14

15

C语言数据类型字节数对照表

数据类型32位系统64位系统有符号范围(近似)无符号范围(近似)说明
char11-128 ~ 1270 ~ 255固定1字节,signed charunsigned char范围不同
short int / signed short22-32,768 ~ 32,7670 ~ 65,535固定2字节
unsigned short int22-0 ~ 65,535
int / signed int44-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295通常4字节(C标准要求至少2字节)
unsigned int44-0 ~ 4,294,967,295
long int / signed long4系统依赖-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295Windows 64位:4字节
Linux/macOS 64位:8字节
unsigned long int4系统依赖-signed long范围
long long int88-9e18 ~ 9e180 ~ 1.8e19固定8字节(C99标准引入)
unsigned long long int88-0 ~ 1.8e19
float44IEEE 754单精度-约6-7位有效数字
double88IEEE 754双精度-约15位有效数字
long double8/12/168/16扩展精度-GCC:16字节
MSVC:8字节
void* (指针)48--地址空间大小:
32位系统:4字节
64位系统:8字节

跨平台固定宽度类型(stdint.h

类型字节数范围(有符号)范围(无符号)
int8_t1-128 ~ 1270 ~ 255 (uint8_t)
int16_t2-32,768 ~ 32,7670 ~ 65,535
int32_t4-2.1e9 ~ 2.1e90 ~ 4.2e9
int64_t8-9e18 ~ 9e180 ~ 1.8e19

典型系统对比

系统/类型long(64位系统)指针(64位系统)long double
Windows 64位4字节8字节8字节(MSVC)
Linux 64位8字节8字节16字节(GCC)
macOS 64位8字节8字节16字节

结构体的声明

结构体是一个或多个变量的集合,这些变量可以是不同的类型

struct 结构体名

{

    数据类型 变量名;

    数据类型 变量名;

}

例如

struct point{int      x;char     y;}

结构体的初始化与调用

struct 结构体名 变量名

struct point p

编写一个函数,传入两个int参数,在函数创建一个结构体point类型的变量

将传入的两个参数分别赋值给该结构体变量的x和y,最后将该结构体变量返回

#include<stdio.h>struct point createPoint(int x ,int y){struct     point    temp;temp.x = x;temp.y = y;return    temp;}int main(int argc, char const *argv[]){struct point p;p = createPoint(5,10);printf( "%d\n", p.x );printf( "%d\n", p.y);return 0;    }

简化写法

#include<stdio.h>typedef struct{int x;int y;}po;int main(int argc, char const *argv[]){po p;p.x = 5;p.y = 10;    printf( "%d\n", p.x );printf( "%d\n", p.y);return 0;}

内存的分类

c程序编译后,会以三种形式使用内存

静态/全局内存

静态声明的变量和全局变量使用这部分内存,这些变量在程序开始运行时分配

直到程序结束才消失

自动内存(栈内存)

函数内部声明的变量使用这个部分内存,在函数被调用时才创建

动态内存(堆内存)

根据需求编写代码动态分配内存,可以编写代码释放,内存中的内容直到释放才消失

例如 动态内存分配

在C语言中,动态分配内存的基本步骤

  1. 使用malloc函数分配内存
  2. void* malloc(size_t)
  3. 如果成功,会返回从堆内存上分配的内存指针
  4. 如果失败,会返回空指针
  5. 使用分配的内存
  6. 使用free函数释放内存
  7. 返回值

示例:

#include<stdio.h>#include<stdlib.h>int main(int argc , char const* argv[]){int *p;p = (int*) malloc (sizeof(int) );** p* = 15;printf(''%d\n", *p);free(p);return 0;}

算法时间复杂度

算法要满足5个特性

有穷性、确定性、可行性、输入、输出

评价算法好坏的基本标准

正确性、可读性、健壮性、高效性

时间复杂度

也称渐近时间复杂度

T(n)    =    O( f(n) )

随着问题规模n的增大,算法执行时间和增长率和f(n)增长率成正比

计算时间复杂度例子

#include<stdio.h>int main(int argc , char const *argv){for(int i = 1 ; i <= n ; i++) //时间复杂度 频度为 n+1{for(int j = 1 j <= n ; j++)    //频度为 n*(n+1){c[ i ][ j ] = 0;        //频度为 n * nfor(int k = 1; k <= n ;k++) //频度为 n * n * (n+1){c[ i ][ j ] =     c[ i ][ j ] + a[ i ][ k ]  * b[ k ][ j ]; //频度为 n * n *  n    最终时间复杂度 T(n)  = O(n³)                 }}}}

对算法时间复杂度的度量,通常只讨论算法在最坏的情况下的时间复杂度,即分析在最坏的情况下,算法执行的时间上界。

http://www.xdnf.cn/news/8112.html

相关文章:

  • Python绘制3D图表
  • PostgreSQL 18 升级新体验:pg_upgrade --swap 极简教程
  • BGE-M3 文本情感分类实战:预训练模型微调,导出ONNX并测试
  • b/s开发 1.0
  • DDS与PLL技术
  • 力扣HOT100之二叉树: 437. 路径总和 III
  • 8天Python从入门到精通【itheima】-29~31
  • dify介绍(优势与作用)
  • 小样本百分比的统计检验
  • AbMole推荐Rapamycin: 自噬、肿瘤、免疫、衰老研究的关键工具
  • 干货分享:90+深度学习开源数据集
  • React 第四十五节 Router 中 useHref() Hook的使用详解及注意事项
  • session、cookie或者jwt 解释一下
  • 十五、Hive 窗口函数
  • java基础(方法)
  • Ubuntu18.04安装ros
  • -40℃到+125℃全温域稳定!车规级晶振如何突破温度极限
  • 27-FreeRTOS的任务管理
  • 华为模拟器练习简单的拓扑图(3台路由器和2台pc)
  • 如何成功开发海外APP:跨国市场的机遇与挑战
  • 杨校老师竞赛课之青科赛GOC3-4年级组模拟题
  • 【Vue】将响应式对象转为非响应式对象
  • 企业级调度器LVS TUN实践
  • 腾讯音乐二面
  • sockaddr结构体详解
  • YOLOv8模型剪枝笔记(DepGraph和Network Slimming网络瘦身)
  • 六、插曲:项目范围管理
  • 东芝发布DFN8×8封装的650V第三代SiC MOSFETs
  • 详解一下Go语言中的ParseInt
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(27):失敗 失败 经验