1. 程式人生 > 實用技巧 >c語言一點小覺悟(1)

c語言一點小覺悟(1)

  1 #include <stdio.h>
  2 
  3 int a = 0x12345678;
  4 int a2 = 0x12345678;
  5 int a3 = 0x12345678;
  6 int a4 = 0x12345678;
  7 int main()
  8 {
  9     int b = 0x12345678;
 10     int b2 = 0x12345678;
 11     int b3 = 0x12345678;
 12     int b4 = 0x12345678;
 13     char *p1,*p2,*p3,p5;
 14     int
*p4,p6; 15 16 17 char *c = "hello"; 18 19 p1 = &b; 20 *p2 = &b; 21 p3 = &a; 22 p4 = &a; 23 *p4 = *p4+1; 24 p5 = a; 25 p6 = a; 26 printf("hello world\n"); 27 printf("int a addr is: %p\n",&a); 28 printf("int a2 addr is: %p\n
",&a2); 29 printf("int a4 addr is: %p\n",&a3); 30 printf("int a3 addr is: %p\n",&a4); 31 printf("int b addr is: %p\n",&b); 32 printf("int b2 addr is: %p\n",&b2); 33 printf("int b3 addr is: %p\n",&b3); 34 printf("int b4 addr is: %p\n",&b4); 35
printf("int main addr is: %p\n",main); 36 printf("===========================\n"); 37 38 printf("pointer p1 addr is: %p\n",p1); 39 printf("*p1 addr is: %p\n",*p1); 40 printf("pointer p3 addr is: %p\n",p3); 41 printf("*p3 addr is: %p\n",*p3); 42 printf("pointer p4 addr is: %p\n",p4); 43 printf("*p4 addr is: %p\n",*p4); 44 printf("pointer p2 addr is: %p\n",p2); 45 printf("*p2 addr is: %p\n",*p2); 46 printf("===========================\n"); 47 printf("char p5 is : %p\n",p5); 48 printf("int p6 is:%p\n",p6); 49 50 printf("============================\n"); 51 printf("str addr is: %p\n","hello"); 52 printf("str addr is: %p\n",&"hello"); 53 printf("============================\n"); 54 printf("str addr is: %s\n",c); 55 printf("str addr is: %p\n",c); 56 printf("str addr is: %p\n",&c); 57 58 return 0; 59 } 60 /* 61 C:\Users\shuai\Desktop\c>gcc -o build 001.c & build 62 001.c: In function 'main': 63 001.c:14:5: warning: assignment from incompatible pointer type [-Wincompatible-p 64 ointer-types] 65 p1 = &b; 66 ^ 67 001.c:15:6: warning: assignment makes integer from pointer without a cast [-Wint 68 -conversion] 69 *p2 = &b; 70 ^ 71 001.c:16:5: warning: assignment from incompatible pointer type [-Wincompatible-p 72 ointer-types] 73 p3 = &a; 74 ^ 75 hello world 76 int a addr is: 0x402008 77 int a2 addr is: 0x40200c 78 int a4 addr is: 0x402010 79 int a3 addr is: 0x402014 80 int b addr is: 0x28cc44 81 int b2 addr is: 0x28cc40 82 int b3 addr is: 0x28cc3c 83 int b4 addr is: 0x28cc38 84 int main addr is: 0x4011d0 85 =========================== 86 pointer p1 addr is: 0x28cc44 87 *p1 addr is: 0x78 88 pointer p3 addr is: 0x402008 89 *p3 addr is: 0x79 90 pointer p4 addr is: 0x402008 91 *p4 addr is: 0x12345679 92 pointer p2 addr is: 0x612b5060 93 *p2 addr is: 0x44 94 =========================== 95 char p5 is : 0x79 96 int p6 is:0x12345679 97 ============================ 98 str addr is: 0x403060 99 str addr is: 0x403060 100 ============================ 101 str addr is: hello 102 str addr is: 0x403060 103 str addr is: 0x28cc40 104 105 106 */ 107 108 /* 109 結論: 110 1 系統中全域性資料空間地址從小往大排列 111 系統中棧空間地址從棧頂往小排列 112 其中貌似main最先初始化,然後才有了後續事件 113 2 *p=*p+1 實際上是指標+1 等效於*p=*(p+1) 即對指標操作 114 *p=(*p)+1 指的是p地址上的資料+1 即對資料操作 注意兩者不同 115 3 char *c="hello" ("%p\n",c)和("%p\n","hello")和("%p\n",&"hello")結果一樣都是常量"hello"地址 116 ("%p\n",&c)取得是c的地址 117 ("%s\n",c)輸出hello 118 4 *p=&b慎用,看起來不倫不類.並且結果未知,(*p==b?) 119 推薦使用p=&b,再*p即是b的值(*p==b為真) 120 121 122 */