1 //数组和指针互换问题 
2 //char *的一些特殊性 ,主要是'\0'要占一个字节
3 //指针类型本质就是整数,可以无损保存和恢复类型
4 //传递参数的时候会损失size信息
5 #include <stdio.h>
6
7 void f(int x[])//数组做参数的话是被完全当做指针使用的
8 {//不论 x的参数是几,打印的结果都是4
9 printf("%d\n",sizeof(x));
10 }
11
12 int main(int argc, char *argv[])//和char **argv 完全一样
13 {
14 int a[] = {1,2,4};
15 int *b;
16
17 //下面这三个一致
18 printf("%d\n",a);
19 printf("%d\n",&a);
20 printf("%d\n",&(a[0]));
21
22 b = a;//那么此时b和a是等效的,像数组一样使用b,像指针一样使用a
23
24 //C语言中数组的作用被大大弱化了,很多都是按照指针的操作进行的
25 *(a+1) = 100;
26
27 printf("%d\n",sizeof(b));//4
28 printf("%d\n",sizeof(a));//12
29
30 printf("-----------------------------------\n");
31
32 char str[] = "abc";//指针可以访问到0123,到三并没有越界
33 char *ch = "abc";//打印ch和&ch是不同的
34
35 str[0] = 'x';//没问题 ,栈空间 ,串在栈里
36 ch[0] = 'x'; //有问题,编译通过,运行失败 ,因为串分配在静态常量空间
37 printf("%d\n",sizeof(str));
38
39
40 printf("-----------------------------------\n");
41
42 int b[] = {1,2,3};
43 char *p = "abc";
44 int a = (int)p;//必须强转,否则CE
45 char *q = (char *)a;
46 //先打印b的地址,记住它(整形ans保存),然后int p = (int *) ans,没问题的;
47 //也就是说C指针提供了很大的灵活性 ,允许程序员对任意地址操作
48
49 printf("-----------------------------------\n");
50 int c[] = {1,2,3};
51 printf("%d\n",sizeof(c));
52 f(c);
53
54 //while(1);
55 return 0;
56 }
57
58