C/C++ 数据类型总结:基本类型、指针、引用、数组、char [] 字符串

一、基本数据类型(内置基础类型,值类型)

存储数据本身的值,变量直接存放数值,分配在栈空间。

整型系列

charshortintlonglong long
无符号:unsigned char/int/long

浮点型

float(单精度)、double(双精度)、long double(长双精度)

布尔类型

bool:取值只有 true(1) / false(0)

特点:

  1. 变量名对应一块内存,里面直接存数据;
  2. 赋值是拷贝值,修改新变量不影响原变量;
  3. sizeof 获取的是自身占用字节大小。

二、指针(Pointer)C语言核心,C++也支持

定义

指针是一个专门存放内存地址的变量,本身存储的不是数据,而是别的变量的地址。
语法:类型 *变量名;

int a = 10;
int *p = &a; // p保存a的地址,&是取地址符

核心操作

  1. &变量:取变量内存地址;
  2. *指针:解引用,访问指针指向地址里的数据;
  3. 指针本身也有地址:&p

特点

  1. 所有类型指针大小一致(32位系统4字节,64位8字节),和指向的数据类型无关;
  2. 指针可以为空:NULL / nullptr(C++11推荐nullptr);
  3. 可以指向堆内存(new/malloc开辟的空间);
  4. 指针可以修改指向:可以让p指向另一个变量。

三、引用(Reference,C++独有,C语言没有)

定义

变量的别名,给已存在的变量起一个另外名字,语法:类型 &引用名 = 原变量;

int a = 10;
int &ref = a;

ref 和 a 是同一块内存,完全等价,修改ref就是修改a。

关键规则

  1. 定义时必须初始化,不能单独定义引用,不能之后再绑定;
  2. 引用一旦绑定一个变量,终身不能再绑定其他变量;
  3. 没有空引用,引用必须关联一个合法变量;
  4. sizeof(引用) 等于原变量大小,引用本身不单独占用内存;
  5. 没有取地址问题:&ref 结果就是原变量a的地址。

指针 vs 引用对比

特性 指针 引用
是否可空 可以为nullptr 不可以,必须初始化
能否更换指向 可以随时指向别的变量 绑定后不可更改
是否独立内存 指针自身占用内存地址空间 无独立内存,只是别名
语法 需要*解引用 直接使用,无需符号

四、数组 Array

一组相同数据类型元素的连续内存集合,名字是数组首元素地址常量。
格式:类型 数组名[大小];

int arr[5] = {1,2,3,4,5};

特性

  1. 内存连续分配,下标从0开始;
  2. 数组名是常量地址,不能被赋值:arr = p; 错误;
  3. 数组名退化为指针:数组名可以隐式转换成指向首元素的指针;
int *p = arr; // 等价于 p = &arr[0];
  1. 一维数组 sizeof(arr) 是整个数组总字节数;退化成指针后sizeof就变成指针大小;
  2. 数组越界不会报错,直接访问非法内存,会造成程序崩溃。

数组和指针的区别

数组是一段固定长度连续内存;指针只是一个地址变量,可以指向任意内存位置。


五、char[] 字符数组(C风格字符串)

定义

char str[] = "hello";
字符串常量"hello"会自动在末尾追加一个结束符 '\0',用来标记字符串结束。

拆解:

char str[] = "abc";
// 实际内存:a b c \0 四个字节

两种写法区别

  1. char arr[] = "123";
    在栈上开辟数组空间,内容可修改;
  2. char *p = "123";
    指针指向全局只读常量区字符串,内容不可修改,强行修改会崩溃。

常用操作(string.h库函数)

strlen:有效字符长度,不计入'\0';
sizeof(str):包含'\0'的总字节数;
strcpy、strcmp、strcat 等函数都依赖末尾的'\0'。


整体关系梳理

  1. 基本类型:存值;
  2. 数组:多个基本类型连续集合,数组名是常量地址;
  3. char[]:特殊的字符数组,C语言字符串;
  4. 指针:存放地址的变量,可指向基本类型、数组、堆内存;
  5. 引用:C++变量别名,依附于已有变量,无独立地址。
posted @ 2026-07-30 09:48  项大哥  阅读(5)  评论(0)    收藏  举报