IOS指针

指针在开发中占比很重,指针还是要弄懂的

看个例子

- (void)viewDidLoad {
    [super viewDidLoad];
   NSString *name = @"dog";
    NSLog(@"%@",name);    
    [self getNewName:name];
    
    NSLog(@"%@",name);
}
//这样并不会修改内容 因为 指针传递的时候 是 实参name 深拷贝 给形参  是另一块地址
 -(void)getNewName :(NSString *)nameN{
     NSLog(@"%p",nameN);
     nameN = @"aaa";
 }
 //地址传递
- (void)viewDidLoad {
    [super viewDidLoad];
   NSString *name = @"dog";
        NSLog(@"%@",name);   
    [self getNewName:&name];
    
    NSLog(@"%@",name);
}
-(void)getNewName :(NSString * __strong*)nameN{
    
    NSLog(@"%p",nameN);
    *nameN = @"aaa";
}
下面来看 p *p &p 三者区别
-(void)test{
    int a = 100;
    int *p = &a;
    NSLog(@"&a---%p,p----%p,*p---%d,a---%d",&a,p,*p,a);
    //结果 &a---0x7ffeede6a14c,p----0x7ffeede6a14c,*p---100,a---100
}

编译器为变量a开辟内存地址,100 以2进制的形式储存在a地址中,p是指针变量的名字,指针变量p指向a变量的,*p 指针指向一般是一个和指针类型一致的变量或者常量 ,&是取地址运算符 &p 取指针变量p的内存地址

注意: &p和p的区别在于:指针p同时也是个变量,既然是变量,编译器肯定要为其分配内存地址,&p就表示编译器为变量p分配的内存地址;而因为p是一个指针变量,这种特殊的身份注定了它要指向另外一个内存地址,程序员按照程序的需要让它指向一个内存地址,所以p表示它指向的内存地址

指针是什么

说之前,先说下 直接引用,通过变量名获取内容

char a;
a = 'b';

编译器自动将变量a的储存内容变为储存地址,根据地址找到变量a的储存空间,字符b以16进制储存在a的储存空间

char a = 'B';
char *p =&a;
变量 地址 储存内容
a 0x7ffc1 01000010
p 0x7ffc2 0x7ffc1

如果想通过间接方式更改a中的值,可以找到指针变量b的地址0x7ffc2,根据地址找到指针b中的内容 0x7ffc1,也就是a的地址,再根据a的地址 0x7ffc1找到a的储藏空间,更改a的值

总结:用来存储变量地址的变量就是指针变量,上面的p就是指针变量,也可以说指针变量p指向a变量

指针定义

一般形式:类名标识符 *指针变量名;
int *a;
float b
"
"是一个说明符,用来说明这个变量是个指针变量,是不能省略的,但它不属于变量名的一部分
前面的类型标识符int、float表示指针变量所指向的变量的类型,而且只能指向这种类型的变量

初始化

int a = 100;
int *p =a;
//或者
int *p = 100; 
//上面两个指针变量p的赋值都是不对的,指针变量是用来存储`变量地址`的 

运算

int a = 1;
int *p = &a;
*p = 2;
 NSLog(@"%d",a);// 结果是2
总结与问题
    int a = 10;
    int *p = &a;
    print("%d",*p);

如果在OC中,NSString *str = @"hello"; 其实str也是 @"hello"所在常量区的地址,那为什么我们平常打印str的时候,直接就是@“hello”这个值,而不是通过 *str来获取呢?
答:NSString本身是一个对象,它不止是char *这些基本类型这么简单。本质上OC的对象是一个结构体。NSLog遇到%@格式和接收对象作为参数时直接调用对象的description方法。与基本数据类型的处理是有区别的。

你可能感兴趣的:(IOS指针)