C/C++ 数据类型总结:基本类型、指针、引用、数组、char [] 字符串
一、基本数据类型(内置基础类型,值类型)
存储数据本身的值,变量直接存放数值,分配在栈空间。
整型系列
char、short、int、long、long long
无符号:unsigned char/int/long
浮点型
float(单精度)、double(双精度)、long double(长双精度)
布尔类型
bool:取值只有 true(1) / false(0)
特点:
- 变量名对应一块内存,里面直接存数据;
- 赋值是拷贝值,修改新变量不影响原变量;
- sizeof 获取的是自身占用字节大小。
二、指针(Pointer)C语言核心,C++也支持
定义
指针是一个专门存放内存地址的变量,本身存储的不是数据,而是别的变量的地址。
语法:类型 *变量名;
int a = 10;
int *p = &a; // p保存a的地址,&是取地址符
核心操作
&变量:取变量内存地址;*指针:解引用,访问指针指向地址里的数据;- 指针本身也有地址:
&p。
特点
- 所有类型指针大小一致(32位系统4字节,64位8字节),和指向的数据类型无关;
- 指针可以为空:
NULL / nullptr(C++11推荐nullptr); - 可以指向堆内存(
new/malloc开辟的空间); - 指针可以修改指向:可以让p指向另一个变量。
三、引用(Reference,C++独有,C语言没有)
定义
变量的别名,给已存在的变量起一个另外名字,语法:类型 &引用名 = 原变量;
int a = 10;
int &ref = a;
ref 和 a 是同一块内存,完全等价,修改ref就是修改a。
关键规则
- 定义时必须初始化,不能单独定义引用,不能之后再绑定;
- 引用一旦绑定一个变量,终身不能再绑定其他变量;
- 没有空引用,引用必须关联一个合法变量;
- sizeof(引用) 等于原变量大小,引用本身不单独占用内存;
- 没有取地址问题:
&ref结果就是原变量a的地址。
指针 vs 引用对比
| 特性 | 指针 | 引用 |
|---|---|---|
| 是否可空 | 可以为nullptr | 不可以,必须初始化 |
| 能否更换指向 | 可以随时指向别的变量 | 绑定后不可更改 |
| 是否独立内存 | 指针自身占用内存地址空间 | 无独立内存,只是别名 |
| 语法 | 需要*解引用 | 直接使用,无需符号 |
四、数组 Array
一组相同数据类型元素的连续内存集合,名字是数组首元素地址常量。
格式:类型 数组名[大小];
int arr[5] = {1,2,3,4,5};
特性
- 内存连续分配,下标从0开始;
- 数组名是常量地址,不能被赋值:
arr = p;错误; - 数组名退化为指针:数组名可以隐式转换成指向首元素的指针;
int *p = arr; // 等价于 p = &arr[0];
- 一维数组
sizeof(arr)是整个数组总字节数;退化成指针后sizeof就变成指针大小; - 数组越界不会报错,直接访问非法内存,会造成程序崩溃。
数组和指针的区别
数组是一段固定长度连续内存;指针只是一个地址变量,可以指向任意内存位置。
五、char[] 字符数组(C风格字符串)
定义
char str[] = "hello";
字符串常量"hello"会自动在末尾追加一个结束符 '\0',用来标记字符串结束。
拆解:
char str[] = "abc";
// 实际内存:a b c \0 四个字节
两种写法区别
char arr[] = "123";
在栈上开辟数组空间,内容可修改;char *p = "123";
指针指向全局只读常量区字符串,内容不可修改,强行修改会崩溃。
常用操作(string.h库函数)
strlen:有效字符长度,不计入'\0';
sizeof(str):包含'\0'的总字节数;
strcpy、strcmp、strcat 等函数都依赖末尾的'\0'。
整体关系梳理
- 基本类型:存值;
- 数组:多个基本类型连续集合,数组名是常量地址;
- char[]:特殊的字符数组,C语言字符串;
- 指针:存放地址的变量,可指向基本类型、数组、堆内存;
- 引用:C++变量别名,依附于已有变量,无独立地址。

浙公网安备 33010602011771号