// main.m
#import <Foundation/Foundation.h>
#import "abc.h"
int main(int argc, const char * argv[]) {
//指针:
/*
指针说白了就是地址.
*/
// int a=20;//首先定义了一个 int 类型的变量a;
// int *p=&a;//定义了一个int *类型的指针p,我们定义的指针p指向我们int 类型变量a的地址,(也就是把变量a的地址存储到指针p中); *:取值运算符 &:取地址运算符
//
// printf("%d
",*p);//这里是我们取出指针 p指向变量a地址里面的值(*--> 是取值运算符)
// printf("%p
",p);//这里是 我们取出指针p中存储的变量a的地址
//
// printf("%p
",&a);//这里是打印出变量a所在的地址
//
//注意: *:取值运算符 &:取地址运算符
//指针所在字节大小和类型无关之和操作系统有关系 ( 操作系统分为32位操作系统和64位操作系统).
//定义一个变量a 并给其赋值
// int a =20;
// printf("%p
",&a);//打印出变量所在的地址
// int b=10;//定义一个变量 b 并给其赋值
// printf("%p
",&b);//打印出变量b所在地址
//
// int *p=&a;//定义一个 int *类型的指针 p 指向我们变量a所在的地址
// printf("%d
",*p);//取出变量a所在地址中的值
//
// p = &b;//这句话的意思是我们的指针 p 又重新指向了 b的地址,里边存储的是变量b的地址
// *p = 100;//通过地址就可以修改对应的值(间接修改)
// printf("%d
",*p);
// printf("%d
",b);
//
//
// printf("指针*p所占字节的大小%lu
",sizeof(p));
// //定义一个char类型的变量
// char c='a';
// //定义一个char类此你给的指针
// char *q=&c;
// //打印c的地址
// printf("&c=%p
",&c);
// printf("&c=%p
",q);
//
// //打印变量c的值
// printf("c=%c
",c);
//
// //打印指针q指向的地址中对应的值
// printf("c=%c
",*q);
//
//
// //使用指针q修改我们变量c的值
// *q='a';
// printf("c=%d
",*q);
// printf("指针*q所占字节大小:%lu
",sizeof(q));
// //定义一个int 类型的变量 a;
// int a=20;
// //定义一个 int *类型的指针指向我们变量a的存储地址
// int *p=&a;
//
//
//
//
// int *q;//野指针,如果定义一个 指针没有给其赋初值或者是指向,这时候的指针就叫做 野指针(孤魂野鬼的意思),一定要避免野指针,因为其很容易使程序出现崩溃
// printf("%d
",*q);
//
//
// int *w=NULL;//当定义指针的时候 我们不想让这个指针指向任何地址,我们可以给这个指针赋值NULL, NULL的意思是代表空.....
//
/*
//指针运算
//指针只有加减 两种运算
//首先我们定义一个int 类型的变量a
int a=8;
//定义一个指针p指向了变量a的地址
int *p=&a;
//打印变量a的地址
printf("&a=%p
",p);
//打印变量a的值
printf("a=%d
",*p);
//加法
printf("a=%d
",*p+1);//取出变量a的地址,并对其进行+1
printf("p=%p
",p);//打印出p的地址和我们变量a 的地址相同,并没有改变地址,改变的只是值(内部的值);
printf("p=%p
",p+1);//向高位移动四个字节
printf("---------------
");
char b='c';
char *q=&b;
printf("&b=%p
",q);
printf("b=%c
",*q);
printf("q+1=%p
",q+1);//想高位移动一个字节
printf("---------------
");
int *r=NULL;
printf("r=%p
",r);
printf("r+1=%p
",r+1);
//由此我们可以看出指针移动的字节大小和我们类型有关系
*/
//减法
//首先定义一个int类型的变量
// int a=6;
// //定义一个指针p;
// int *p=&a;
//
//// // p=1; //这里的p代表的是地址,而1 代表的是我们的整形变量,爆黄是因为类型不匹配
//// p=p+1;//代表的是:这里的p指的是地址,代表的在是我们p地址的基础上向高位移动4个字节
//// printf("%d
",*p);
////
////
// printf("&a=%p
",p);//打印变量a的地址
// //打印变量a的值
// printf("a=%d
",*p);
// printf("%d
",*p-1);
// printf("p-1=%p
",p-1);//代表的是向低位移动四个字节
//
// //指针与数组的关系:
// int arr[]={2,4,6,8,9};
//// printf("arr=%p
",arr);
////
// int *p=arr;
// printf("p=%p
",p);
// //由此可以得知我们的数组名就是我们首地址
// printf("%d
",*p);//这里取出的是我们数组首地址中下标为0的元素也就是2;
// printf("%d
",*p+1);//取出2之后对其进行+1操作
// printf("%d
",*(p+1));//取出下标为1的元素
//
//
// arr[0]=10;
// printf("%d
",arr[0]);
// for (int i=0; i<5; i++) {
// printf("%d ",arr[i]);
// }
//
// printf("
");
// //通过指针找出对应下标代表的元素并进行修改
// *(p+3)=20;
//
// printf("%d
",arr[0]);
// for (int i=0; i<5; i++) {
// printf("%d ",arr[i]);
// }
//
// printf("
");
//
// //打印数组所占字节大小
//
// printf("arr =%lu
",sizeof(arr));//数组所占自己多少和我们操作系统无关,和我们元素个数以及其对应的类型有关,数组名是常量地址,不能重指向(也不能赋值);
//
// int arr[2][3]={1,2,3,4,5,6};
//
// int *p=&arr[0][2];
// printf("%d
",*p);
//
//
// //指针与字符串
// char string[]="iphone";
// printf("string=%lu
",sizeof(string));
// printf("string=%p
",string);
// char *p=string;
// printf("p=%p
",p);
// printf("string=%c
",*p);
// printf("string=%c
",*(p+1));//取出我们字符串中的元素
//
//
// *(p+1)='v';//修改字符串中的元素
// printf("string=%s
",string);
//
//编程实现,通过指针计算字符串的长度;
// char str1[]="iphone";
// int count=0;//用来计数
// char *p=str1;
// while (*(p+count)!=' ') {
// count++;
// }printf("%d
",count);
//
// 指针与数组
// char *str[3]={"ios","iphone","imac"};//字符串指针数组
//
// printf("str=%s
",*str);
////
//// printf("str=%c
",*(str+2)[0]);//iphone//为什么取"iphone的p会崩溃
////
////
////
// printf("str=%s
",str[0]);
//
// printf("ios=%c
",*str[0]);
//
// //取ios的o
// printf("ios=%c
",*(*str+2));//????
//printf("str=%c
",*(*(str+1)+1));//"iphone"中的p
//
// printf("str=%c
",*(*(str+2)+1));//"imac"中的m
// char *str[3]={"ipad","iphone6s","INM"};
// //取出ipad
// printf("str=%s
",*str);
// printf("str=%s
",*(str+1));
// printf("str=%s
",*(str+2));
////取出ipad的p
// printf("str=%c
",*(*str+1));
//
// printf("str=%c
",*(*(str+1)+6));
//
// *str="fgf";
// printf("str=%s
",*str);
// //常量区的东西是不可以被修改,只能看不能碰
// *(*str+1)='t';
// printf("str=%c
",*(*str+1));
//
//
//首先定义两个变量a b实现的是两个值得交换(使用函数);
int a=10;int b=20;
cd(&a,&b);
printf("a=%d
,b=%d
",a,b);
return 0;
}