今晚听同学讲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”) |