#import//交換函數 void swap(int x, int y) { printf("x=%d,y=%d",x,y); int temp = 0; temp = x; x = y; y = temp; printf("x=%d,y=%d",x,y); } // void swap2(int *x , int *y) { //不改地址,改地址對應的值 printf("x=%d,y=%d",*x,*y); int temp = 0; temp = *x; *x = *y; *y = temp; printf("x=%d,y=%d",*x,*y); } int main(int argc, const char * argv[]) { //C語言定義指針的時候,喜歡使用p,q,r等; //類型是int* //變量名p //初值NULL恆等於0 // int *p = NULL; // //打印指針%p // printf("%p %lu\n",p,sizeof(p)); // // char *q = 0*1000; // printf("%p %lu\n ",q,sizeof(q)); #pragma mark---------指針總結 //我們通常所說的指針,指的是指針變量, //指針變量是存放, 內存地址 (內存編號)的變量. //32位,8個0或1表示每8位一個字節 //指針占用的內存都一樣,指針變量占用的內存不一樣 //p和q所占內存一樣,因為都是32或64位系統下的首地址,都占那麼多,而int,char決定長度不一樣,int占四間房,char就占1間房 //取地址符,是知道int a = 3,a值是3, int *P想指向內存中a = 3,這時候有了取地址符&a,就是a的首地址, // int a = 3; // int *p = &a; // printf("p=%p\n",p); // printf("&a=%p\n",&a); //// printf("%d",*p); // // char b = 'a'; // char *q = &b; // printf("%p %lu\n",q,sizeof(q)); //整型等於整型地址,字符型等於字符型地址 //沒有誰是猜的地址,&取地址符,去整型,就是整型指針.... //*p 取值符 地址裡存放的內容 //取多少字節取決於類型修飾符 // printf("%d \n",*p);//*p 取值運算符 用於獲取 指針對應的值 // printf("%d %c\n",*p,*q); //獲取地址兩種途徑 //第一,直接給地址 //第二,用取值符號&來取 #pragma mark-------------指針變量的賦值,代表指針變量的重指向 //指針變量指向 //指針變量的賦值,代表指針變量的重指向 //注意 //不要讓整型指向字符型 //也不要讓字符型指向整型 // p = &b;錯誤 // int a = 10; // int *p = &a; // printf("指針p存放的地址: %p 指針p占用的內存空間大小:%lu 這個內存空間裡存放的值: %d\n",p,sizeof(p),*p); // //p自己也占內存 // //它們都放在棧區,一個一個分配內存 // printf("p自己的地址: %p\n",&p); // int b = 20; // p = &b; // printf("指針p保存的新地址:%p 新的內存空間裡存放的值 %d\n",p,*p); #pragma mark-------------指針的算術運算 //只有加減運算 //int * p = &a; //P++;向高位移動四個字節 //p--;向低位移動4個字節 //p每加一代表加了這麼大類型 //p++//向高位移動四個字節 //p+1//沒有變 //*(p++) //*(p+1) //int * p = &a;僅僅告訴編輯器 p是一個指針 //*p = 20;操作符,取地址對應的值 //p 指針(地址) *p取值 &p地址 &(*P)地址 #pragma mark-------------數組與指針 // int arr[5]={9,2,3,4,5}; // printf("%p\n",arr); // printf("%p\n",&arr[0]); // int *p = arr; // printf("%d\n",*p); // printf("%d\n",*(p+1)); // printf("---%d\n",p[1]); // arr[1]=8;//直接改值 // *(p+1)=7;//間接改值 // printf("%d\n",*(p+1)); #pragma mark-------------數組去*號加[]原則,把數字擴出來 // printf("%d\n",*(p+1)); // printf("%d\n",p[1]); //p[2] *(p+2) arr[2] // p=arr+3;//指針變量是變量,可以重指向(賦值) //arr = p;數組名是一個常量指針,不可以改變賦值. //通過數組元素求數組元素個數,sizeof(a)/4 // short a[4]={3,7,9,1}; // int *p1 = a; // char *p2 = a; // printf("%d",*p1); // printf("%d",*p2); #pragma mark-------------字符串與指針 //可以操作單個字符, *(p+2)='z'; //也可以操作整個字符串 printf("%s",(p+2)); // char str[]="iPhone"; // char* p = str; // *(p+2)='z'; // printf("%s",(p+2)); #pragma mark-------------指針數組 //存放指針的數組是指針數組 //常量區 //棧區.拷貝常量區 // char *p1 = "iPhone"; // char *p2 = "Android"; // char *p3 = "win8"; // char *strings[3]={p1,p2,p3}; // char *strings[3]={"iphone","Android","win8"}; //操作整個字符串 //打印指針數組(指針字符串) // for (int i = 0; i<3; i++) { // printf("%s ",strings[i]); // } // printf("%s,%s,%s",strings[0],strings[1],strings[2]); //操作單個字符串 // *(strings[1]+4) = 'x';//指向常量,不能賦值 // char c = *(strings[1]+4); // printf("\n %c",*(strings[1]+4)); // printf("\n %c",strings[1][4]); // #pragma mark-------------指針與函數 //改變不了值,因為是你壓根沒有改變a,b,而是改變它的副本x,y int a = 10,b = 20; // swap(a, b); // printf("%d,%d",a,b); // int *p = &a; // int *q = &b; // swap2(p, q); //不改地址,改地址對應的值 swap2(&a, &b); printf("a=%d,b=%d",a,b); //學好指針,需要多畫圖 return 0; }