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