#import <Foundation/Foundation.h> //交换函数 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 ",p,sizeof(p)); // // char *q = 0*1000; // printf("%p %lu ",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 ",p); // printf("&a=%p ",&a); //// printf("%d",*p); // // char b = 'a'; // char *q = &b; // printf("%p %lu ",q,sizeof(q)); //整型等于整型地址,字符型等于字符型地址 //没有谁是猜的地址,&取地址符,去整型,就是整型指针.... //*p 取值符 地址里存放的内容 //取多少字节取决于类型修饰符 // printf("%d ",*p);//*p 取值运算符 用于获取 指针相应的值 // printf("%d %c ",*p,*q); //获取地址两种途径 //第一,直接给地址 //第二,用取值符号&来取 #pragma mark-------------指针变量的赋值,代表指针变量的重指向 //指针变量指向 //指针变量的赋值,代表指针变量的重指向 //注意 //不要让整型指向字符型 //也不要让字符型指向整型 // p = &b;错误 // int a = 10; // int *p = &a; // printf("指针p存放的地址: %p 指针p占用的内存空间大小:%lu 这个内存空间里存放的值: %d ",p,sizeof(p),*p); // //p自己也占内存 // //它们都放在栈区,一个一个分配内存 // printf("p自己的地址: %p ",&p); // int b = 20; // p = &b; // printf("指针p保存的新地址:%p 新的内存空间里存放的值 %d ",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 ",arr); // printf("%p ",&arr[0]); // int *p = arr; // printf("%d ",*p); // printf("%d ",*(p+1)); // printf("---%d ",p[1]); // arr[1]=8;//直接改值 // *(p+1)=7;//间接改值 // printf("%d ",*(p+1)); #pragma mark-------------数组去*号加[]原则,把数字扩出来 // printf("%d ",*(p+1)); // printf("%d ",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(" %c",*(strings[1]+4)); // printf(" %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; }