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