IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【c语言基础】基础笔记(还债) -> 正文阅读

[C++知识库]【c语言基础】基础笔记(还债)

c语言基础知识记录

一、数据类型

数据类型:本质是固定大小内存块的别名
变量:本质为一段连续内存空间的别名

int a; //告诉编译器分配4个字节的空间
int b[10]; //40字节
printf("b:%d, b+1:%d, &b:%d, &b+1:%d\n", b, b+1, &b, &b+1);
// b与&b一样,b+1为b的地址+4,&b+1为b的地址+40 
// b 代表的是数组首元素的地址 
// &b 代表的是整个数组的地址 数据类型:有10个int元素的数组

sizeof:计算数据类型占内存空间的大小,返回类型为unsigned int
typedef:给已经存在的数据类型起别名,自定义类型

typedef long long UU_LONG; //用于跨平台

二、内存模型

1.几个区

在这里插入图片描述
栈区:自动申请自动释放,主要是局部变量(函数参数形参)、数组(char str[]=“hello world”)

堆区:手动申请,手动释放

(1)c语言:malloc/free (函数)malloc不一定能分配成功,返回void *

注意: free释放的是ret指针指向的内存空间,但是ret指针本身是没有变化的

 free(ret);
 ret=NULL;

在这里插入图片描述
图解:
在这里插入图片描述
(2)c++:new/delete (操作符)new一定能分配成功

全局区

int a = 100; //全局区 默认同下
extern int a = 100; //全局区 外部链接
static int b = 100; //静态全局区 内部链接 只能在当前文件中使用

2.方向

(1)栈的生长方向:取决于开口方向
(2)内存的生长方向
大端模式:低位字节——>高位字节 (下图右)
小端模式:低位字节——>高位字节 (下图左)
在这里插入图片描述

三、指针 指针变量

1.概念

  • 指针是一种数据类型,用来保存内存地址
  • 不管几级(* ** ***)、指向什么样的类型的数据,指针变量都是占4个字节
  • 指针的意义:间接赋值

2.野指针

野指针:是指指向一个已经删除的对象,或者是未申请访问权限内存区域的指针
后果:内存泄漏
具体情况:
(1)指针变量没有初始化

// 错误做法
int* p;
printf("%d",*p);

所以一拿到指针变量就直接置空

(2)指针指向的内存释放了,但是指针没有置空
free(p)只释放p指向的内存释放掉了,但是对p没有任何操作

// 正确做法
free(p);
p=NULL;

(3) 越界访问

// 错误
char str[3] = "abc";

字符串最后有一个\0

3.指针的步长

指针步长:指针+1(加了多少字节),取决于指针指向的数据的类型

char *p = NULL;
printf("%d\n",p); //0
printf("%d\n",p+1); //1

int *q = NULL;
printf("%d\n",q); //0
printf("%d\n",q+1); //4

char buf[1024] = { 0 }; //40字节
printf("%d\n",buf); //数组名 = buf首元素的地址 = buf数组的地址
printf("%d\n",&buf); //buf的地址
printf("%d\n",buf+1); //buf的首地址+1 (加了1个元素char)
printf("%d\n",&buf+1); //buf的首地址+1024 (加了1个buf=1024个char)

几个常用的库函数:
memcpyvoid *memcpy(void *str1, const void *str2, size_t n)存储区 str2 复制 n 个字节到存储区 str1
memsetvoid *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符

4.指针的特性

(1)输入特性

void p_intArray(int* arr /*in*/, int len /*len*/);

(2)输出特性

分配空间

void allocateSpace(char** p /*out*/); //把指针作为输出,从函数中输出一个分配的空间

四、引用(变量的别名)[c++]

int a;
int *p=&a;//指针有自己的指针名字和地址,存储了指向对象的地址(可以更改→指向别的对象的地址)
int &b=a;//引用即别名(一旦声明则不可变更) 引用b和被引用的a用同一个地址:符号表中2个变量名指向同一个地址int &b=a和int* const pp=&a;一样不能改变指向的对象,但能改变指向对象的值)
//不同在于b的地址就是a的地址       即&b == &a
//而pp有自己的地址 pp存放了a的地址 即pp == &a
符号表存放内容:	变量名	变量地址     【符号表生成后不再改变】
int a			a		a的地址
指针p:			指针名	指针地址    而指针指向的a地址(存放的数据)可以改变		【不安全】
引用b:			引用名b	引用对象a的地址→→→故引用对象不能改变		【安全】

1.数组引用

在这里插入图片描述
先定义数组类型,再创建引用

typedef int ARR_TYPE[3]; //ARR_TYPE[3]为有三个元素的int数组的别名
ARR_TYPE[3]& arrRef = arr; //arrRef为arr的引用

或者直接给数组取别名:

int(&rf)[3] = arr

2.函数中引用

函数中的引用:函数的参数、函数的返回值
(1)在函数作传参使用
传递一个引用→→必然存在且有效【安全但没有指针快,一个地址总比复杂数据传递快】(用的)
传递一个指针→→指针不一定有效【需要判断所传递指针是否非空】

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:38:17  更:2021-12-08 13:38:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:24:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码