1、定义与内存分配
1)char 数组
数组是固定大小的,分配内存时它会根据数组的大小分配连续的内存空间。数组的大小在编译时确定。
#include <stdio.h> int main() { // 定义一个长度为10的字符数组 char arr[10]; // 给数组中的每个元素赋值 arr[0] = 'H'; arr[1] = 'e'; arr[2] = 'l'; arr[3] = 'l'; arr[4] = 'o'; arr[5] = ','; arr[6] = ' '; arr[7] = 'W'; arr[8] = 'o'; arr[9] = 'r'; // 输出字符数组的内容 printf("字符数组内容: %s\n", arr); return 0; }
2)char 指针
指针变量用于存储地址。它不直接存储数据,而是存储数据的地址。指针本身不负责分配内存,通常通过动态分配内存来使用。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *ptr; // ptr 是一个指针,指向某个 char 类型的数据 // 动态分配内存空间,10 个 char 大小 ptr = malloc(10 * sizeof(char)); // 检查内存分配是否成功 if (ptr == NULL) { printf("内存分配失败!\n"); return 1; // 返回非 0 值表示错误 } // 使用 memset 初始化内存 memset(ptr, 0, 10 * sizeof(char)); // 将分配的内存块初始化为 0 // 给内存中的字符数组赋值 strcpy(ptr, "Hello"); // 打印字符串 printf("ptr 指向的字符串: %s\n", ptr); // 释放动态分配的内存 free(ptr); return 0; }
2、常量与可变性
1)char 数组
数组是一个固定大小的结构,一旦定义,不能改变大小,元素数量是固定的。
#include <stdio.h> int main() { char arr[] = "hello"; // 创建一个包含 "hello" 字符串和 null 终止符的字符数组 printf("Array content: %s\n", arr); // 输出数组内容 printf("Array length (excluding null terminator): %lu\n", sizeof(arr) - 1); // 输出数组长度,不包括 null 终止符 return 0; }
2)char 指针
指针指向的内存地址可以修改,可以使指针指向不同的内存区域或字符数组。
#include <stdio.h> int main() { char *ptr = "hello"; // 指针初始化为指向字符串 "hello" printf("ptr points to: %s\n", ptr); // 输出: ptr points to: hello ptr = "world"; // 改变指针 ptr 的指向,指向字符串 "world" printf("ptr now points to: %s\n", ptr); // 输出: ptr now points to: world return 0; }
3、语法差异
1)char 数组
数组名本身就代表了指向数组首元素的指针。
#include <stdio.h> int main() { char arr[10]; // 声明一个包含 10 个元素的字符数组 printf("%p\n", arr); // 输出 arr 数组的地址,实际上是 arr[0] 的地址 return 0; }
2)char 指针
指针是一个明确的变量,需要被初始化并且指向某个地址。
#include <stdio.h> int main() { // 定义一个字符数组 char arr[] = "Hello, World!"; // 声明一个指针 ptr,指向 arr 数组的首地址 char *ptr = arr; // 输出 ptr 指向的地址 printf("ptr points to address: %p\n", ptr); // 输出 ptr 指向的地址,等同于 arr 的地址 // 输出 arr 的地址 printf("arr address: %p\n", arr); // 输出 arr 数组的地址,应该与 ptr 指向的地址相同 return 0; }
4、内存大小
1)char 数组
数组的大小在声明时确定,并且存储在栈上。
#include <stdio.h> int main() { // 定义并初始化一个大小为 10 的字符数组 char arr[10] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 字符数组,包含 10 个字符 // 输出数组内容(打印字符串) printf("数组内容: %s\n", arr); // 输出: Hello // 输出数组的第一个元素 printf("第一个字符: %c\n", arr[0]); // 输出: H return 0; }
2)char 指针
#include <stdio.h> #include <stdlib.h> int main() { // 在堆上分配一个大小为 10 的 char 数组 char *arr = (char *)malloc(10 * sizeof(char)); if (arr == NULL) { printf("内存分配失败\n"); return 1; } arr[0] = 'H'; arr[1] = 'e'; arr[2] = 'l'; arr[3] = 'l'; arr[4] = 'o'; arr[5] = '\0'; printf("堆上的数组内容: %s\n", arr); // 输出: Hello free(arr); // 释放堆内存 return 0; }