打印
[其它应用]

C语言中字符数组和字符指针之间的区别。

[复制链接]
221|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
哈根达斯uz|  楼主 | 2024-2-25 19:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>

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

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

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

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

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

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

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

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

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

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

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

在 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 | 只看该作者
将修改数组和指针的示例分开,以强调它们之间的区别。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

239

帖子

0

粉丝