- #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() 释放动态分配内存以避免内存泄漏的注释。
|