看Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法这本书的时候看到有一个说多用类型常量,少用#define预处理指令 ,在这里面有说到指针常量,之前学C C++的时候也遇到过, 现在算是将这些小结。
最重要的一句秘诀就是:*(指针) const(常量) 谁在前先读谁,谁在前谁不允许改变。
下面是C C++ OC中的例子,其中在OC中指针常量只能赋值一次,不能改变
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// C -----------------------------------------
int a=3,b=1;
//常量指针
int const *p1=&a;
//指针常量
int *const p2=&b;
NSLog(@"p1=%d p2=%d a=%d b=%d",*p1,*p2,a,b);
//改变指针 将p1指向a p1指针变量存的地址改变 b的地址改为a的地址
p1=&b;
NSLog(@"p1=%d p2=%d a=%d b=%d",*p1,*p2,a,b);
//改变变量
*p2=5; // p2 指针变量存的地址不变 改变的是p2指的变量的值
NSLog(@"p1=%d p2=%d a=%d b=%d",*p1,*p2,a,b);
// OC------------------------------------------
NSString *str = @"abc";
NSString *str2=@"123";
NSLog(@"str的地址:%p 指向变量的地址:%p 指向变量值:%@",&str,str,str);
NSLog(@"str2的地址:%p 指向变量的地址:%p 指向变量值:%@",&str2,str2,str2);
NSString const * strp=str;
NSLog(@"strp=%@ str=%@ str2=%@",strp,str,str2);
strp=str2;
NSLog(@"strp=%@ str=%@ str2=%@",strp,str,str2);
//在oc中NSObject类型指针常量赋值 无法改变常量
NSString *const strp1=str2;
NSLog(@"strp1=%@ str=%@ str2=%@",strp1,str,str2);
str2=@"xyz";
NSLog(@"strp1=%@ str=%@ str2=%@",strp1,str,str2);
}
return 0;
}
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
string str1 = "abc";
string str2 = "345";
//常量指针
string const *str1Prt = &str1;
//指针常量
string * const str2Prt = &str2;
// 获取str1Prt 指针存的地址、指向的地址 &str1Prt是自身的地址
cout << str1Prt << " " << *str1Prt << endl;
//改变指针
str1Prt = &str2;
cout << str1Prt << " " << *str1Prt << endl;
cout << str2Prt << " " << *str2Prt << " " << str1 << " " << str2 << endl;
//改变变量
*str2Prt = "fff";
cout << str2Prt << " " << *str2Prt << " " << str1 << " " << str2 << endl;
return 0;
}
时间: 2024-11-05 19:35:50