- 函数中return只能返回一个值,指针可以使得函数有多个返回值。通过传指针参数,最终函数执行完毕,指针参数就相当于是返回值,调用者可以使用该指针或该指针指向的变量。
- 指针的用途:函数返回运算状态,而运算结果通过指针返回。比如C语言中除法,用1表示成功,0表示出错。计算结果用指针参数返回。其他语言有异常机制解决类似问题。
- 指针不能够还没赋值就去使用,比如
int *p; *p = 100; // 这样做是错误的,程序可能正常运行,但终会出错。因为p没有指向变量
int *p = 0;
*p = 10; // 也是错误的
// 下面这样做才是正确的 int a; int *p; p = &a; *p = 4; - 数组变量本身表达地址, int a[5]; int *p = a; //无需加& , 但是数组的单元表达的是变量,需要用&取地址。int *b = &a[4];
- [] 运算符可以对数组用,也可以对指针用。
- * 运算符可以对指针用,也可以对数组用。*a = 5; //a是数组
- 数组变量可以理解为是const的指针,不能被赋值。意思是不能把其他变量的地址赋值给数组变量本身。可以理解为数组变量本身是一个常量。
- 指针可以是const,指针所指也可以是const。
- 指针是const,表示一旦得到了某个变量的地址,不能再指向其他的变量。
int * const p = &i; *p = 26; // ok p++; // error
- 指针所指是const:表示不能通过这个指针去修改那个变量。并不能使得那个变量成为const
const int * p = &i; *p = 26; // error, *p是const,但是注意i的值并不是const i = 26; //ok p++; //ok p = &j;//ok
- const 的位置不同,含义不同
int i; const int * p1 = &i; // 不能通过*p1 修改i 变量的值 int const * p2 = &i; // 不能通过*p2 修改i 变量的值 int * const p3 = &i; // p3不能指向其他变量,只能指向i 如何判断的? const在* 前面表示不能通过*p 来修改变量的值 const 在* 后面表示指针p不能再指向其他变量
- 指针是const,表示一旦得到了某个变量的地址,不能再指向其他的变量。
- 转换:总是可以把一个非const的值转换成const的。当要传递的参数类型比地址大的时候,这是常用的手段:既能用比较少的字节数传递值给参数,又能避免函数对面的变量的修改。比如结构体,结构体传指针,如果不想函数对结构体进行修改,就可以加上const。
- const数组,因为数组本身就不能再被赋值其他变量的地址了。所以cosnt int a[] = {1,2,3,4,5}; 表示数组的每个单元不能被改变,意思是1,2,3,4,5都是常量,不能被改变了。只能在初始化的时候对数组赋值。
- 因为把数组传入函数时,传入的是地址。函数内部可以对数组进行修改,如果不想函数内部对数组进行修改,可以加上const。