太一的博客

一个程序学徒

指针

字符指针

  • C语言中没有专门的字符串变量,可以用字符数组来保存字符串
    • char str1[] = "cppcourse";
    • 这里的 str1 是字符数组变量,str1 保存了字符串 “cppcourse”
  • 也可以用字符指针指向字符串常量。
    • char* str2 = "cppcourse";
    • 这里的 str2 是字符指针变量,str2 并不保存字符串 “cppcourse” 本身,而是保存常量 “cppcourse” 的地址。
    • 由于 str2 指向的是字符串常量 **”cppcouse”**,常量不能被更改,因而 str2[0] = ‘C’; 将引发错误

字符数组与字符指针的区别

char s[] = "hello"; 修改为 char* s = "hello"; 有何区别?

  1. 存储分配

字符数组,存储在栈上

字符指针,指针变量存储在栈上,指向的字符串常量存储在常量区

  1. 读写权限

字符数组的数据可读可写,字符指针指向的数据不可以写

  1. 初始化

字符数组初始化时,将字符串保存在字符数组保存的空间中。字符指针初始化时,仅仅把字符常量的地址保存在字符指针。

  1. 执行效率

字符数组,直接访问。字符指针,间接访问。因而字符数组的执行效率更高。

指针与const

  • 指向常量的指针:const int* p这里可以把*p看成常量
  • 指针常量,也称为常指针int *const p; 这里可以把p看成常量

指向常量的指针:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(void)
{
int n = 5;
const int* p;
p = &n;
*p = 10; // error 因为*p指向的是常量

return 0;
}

指针常量:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(void)
{
int n = 5;

int* const p2 = &n;
int n2 = 100;
*p2 = 100; // OK
p2 = &n2; // error: assignment of read-only variable 'p2'
return 0;
}

指针的使用原则

  • 永远要清楚指针指向了哪里
    • 杜绝空悬指针与野指针
    • 空悬指针是指已经销毁的对象或已经回收的地址
    • 野指针是指未初始化的指针