[其它应用] C语言中字符数组和字符指针之间的区别。

[复制链接]
711|3
 楼主| 哈根达斯uz 发表于 2024-2-25 19:43 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>

  2. void test() {
  3.     // arr是字符数组
  4.     char arr[12] = "Articleworld";

  5.     // ptr是指向字符的指针
  6.     char *ptr = "Articleworld";
  7. }

  8. int main() {
  9.     // arr是字符数组
  10.     char arr[] = "Articleworld";

  11.     // ptr是指向字符的指针
  12.     char *ptr = "Articleworld";

  13.     printf("arr的大小 %ld\n", sizeof(arr));  // sizeof(arr)给出数组arr中字符的总数
  14.     printf("ptr的大小 %ld", sizeof(ptr));    // sizeof(ptr)给出指针的大小,而不是它指向的字符串的大小

  15.     // 区别
  16.     // 1. 数组存储在连续的内存位置中,而指针存储字符的地址。
  17.     // 2. sizeof(arr)给出数组的总大小,而sizeof(ptr)给出指针的大小。
  18.     // 3. 数组不能递增(arr++是非法的),而指针可以递增(ptr++是合法的)。
  19.     // 4. 数组可以修改,但字符串文字(比如"Articleworld")是只读的。
  20.     // 5. 未初始化的指针可能导致未定义的行为。

  21.     // 修改数组的示例
  22.     arr[0] = 'a';     // 有效表达式
  23.     arr[10] = 'M';    // 有效表达式
  24.     arr[11] = 'M';    // 有效表达式

  25.     // 通过指针修改字符串文字的示例
  26.     // 这会导致未定义的行为
  27.     // ptr[0] = 'P';   // 无效表达式
  28.     // *ptr = 'W';     // 无效表达式

  29.     // 未初始化的指针
  30.     char *uninitializedPtr;
  31.     // uninitializedPtr[0] = 'A';    // 无效表达式
  32.     // gets(uninitializedPtr);       // 未定义的行为
  33.     // scanf("%s", uninitializedPtr); // 未定义的行为
  34.     // strcpy(uninitializedPtr, "source");     // 未定义的行为
  35.     // strcat(uninitializedPtr, "second string"); // 未定义的行为

  36.     // 动态内存分配
  37.     char *dynamicPtr = (char*)malloc(12);
  38.     // 不要忘记释放分配的内存,以避免内存泄漏
  39.     free(dynamicPtr);

  40.     return 0;
  41. }
这里有一些修正和额外的解释:

在 printf("ptr的大小 %ld", sizeof(ptr)); 中,sizeof(ptr) 给出指针的大小,而不是它指向的字符串的大小。这通常是4或8字节,取决于体系结构。

为了更好的清晰度,修正了 printf 语句。

将修改数组和指针的示例分开,以强调它们之间的区别。

对未初始化的指针的使用进行了注释,因为它导致未定义的行为。

添加了有关使用 free() 释放动态分配内存以避免内存泄漏的注释。

小夏天的大西瓜 发表于 2024-2-26 18:10 | 显示全部楼层
在 printf("ptr的大小 %ld", sizeof(ptr)); 中,sizeof(ptr) 给出指针的大小,而不是它指向的字符串的大小。这通常是4或8字节,取决于体系结构。
中国龙芯CDX 发表于 2024-2-26 21:36 | 显示全部楼层
将修改数组和指针的示例分开,以强调它们之间的区别。
小岛西岸来信 发表于 2025-8-30 14:07 | 显示全部楼层
字符数组是存储字符的连续内存空间,有固定大小,内容可修改,数组名是首地址常量。字符指针是指向字符的指针变量,可指向不同地址,内容是否可改取决于指向的空间(如字符串常量区不可改)。数组分配在栈 / 全局区,指针本身占 4/8 字节,指向的内容在不同区域。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

382

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部