今晚听同学讲C中的指针, 但有的地方介绍的不是很清楚。回来后写的下面的测试代码, 以区别char* 与 char[].
代码如下:
#include <stdio.h>
int main(int argc, char** argv)
{
int i = 'a'; //主要作为参照
char str0[] = "abcd";//"abcd"在栈区
char str1[] = "abcd";//在栈区
char* string0 = "abcd";//"abcd"在文字常量区, string0存储在栈区
char* string1 = "abcd";//"abcd"与上面的的相同, string1存储在栈区
if(str0 == string0) //比较str0与string0指向的位置
printf("str = string\n");
else printf("str != string\n");
if(string0 == string1)
printf("string0 = string1\n");
else printf("string0 != string1\n");
if(str0 == str1)
printf("str0 = str1\n");
else printf("str0 != str1\n");
if(strcmp(str0, string0) == 0&&strcmp(str0, str1) == 0&&strcmp(str0, string1) == 0)//比较指向的内容
printf("str equals string\n");
printf("\n\n%d, %x\n", &i, i); //输出i 的地址 和 char 'a’ 的十六进制值 61
printf("%d, %d\n", &str0, &str1); //输出str0 与 str1 的地址
printf("%d, %d\n", str0, str1); // 输出str0 与 str1 的值
printf("%d, %d\n", *(int*)(str0), *(int*)str1);//将str0与str1所指的值的前4个byte以一个int的形式输出
printf("%d, %d\n", &string0, &string1); //输出string0 与 string1 的地址
printf("%d, %d\n", string0, string1); //输出string0 与 string1 的值
printf("%d, %d\n", *(int*)string0, *(int*)string1);//将string0与string1所指的值的前4个byte以一个int的形式输出
return 0;
}
运行结果:
C:\Users\Jiabiao\Desktop>gcc test.c
C:\Users\Jiabiao\Desktop>a.exe
str != string
string0 = string1
str0 != str1
str equals string
2686748, 61
2686743, 2686738
2686743, 2686738
1684234849, 1684234849 //由于cpu的不同, 有的电脑可能会输出1633837924=0x61626364
2686732, 2686728
4206692, 4206692
1684234849, 1684234849 //0x64636261
C:\Users\Jiabiao\Desktop>
从输出结果可以看出char[] 与char* 是有很大的不同。上例中各变量在内存中的表示如下图所示:
|
p |
“abcd” | ||
|
…… | |||
|
i |
0x61 | ||
|
str0 (不占用内存空间) |
‘a’ | ||
|
‘b’ | |||
|
‘c’ | |||
|
‘d’ | |||
|
\0 | |||
|
str1 (不占用内存空间) |
‘a’ | ||
|
‘b’ | |||
|
‘c’ | |||
|
‘d’ | |||
|
\0 | |||
|
string0 |
p(指向“abcd”) | ||
|
string1 |
p(指向“abcd”) | ||
本文通过一个示例程序详细对比了C语言中char*指针与char[]数组在内存分配、比较操作及输出行为上的差异,帮助读者理解两者的工作原理。
682

被折叠的 条评论
为什么被折叠?



