蓝桥杯老师说指针

 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  

 

posted @ 2013-05-01 09:48  加拿大小哥哥  阅读(250)  评论(0编辑  收藏  举报