前言:为什么要用指针

使用指针,便得明白为什么要用指针,它有什么优点值得去用

指针的优点:
1.为不同函数提供调用局部变量的方法
2.支持 C 动态内存分配
3.可以改善某些子程序的效率
    (如,缓冲区或比较大的数据结构,使用指针传递地址而不传递实际数据,这样即提高传输速度,又节省大量内存)
4.为动态数据结构(如,二叉树、链表)提供支持

0x01 概念

指针变量是专门用来记录地址数据,因此有指针就是内存地址的说法
普通变量存储的是变量对应的值,而指针变量存储的是另外一个变量的地址,用这个地址就可以找到这个变量
每个指针变量其实都有两个地址,一个是指向普通变量的地址,另一个是指针变量自己的地址

1
2
3
4
5
6
7
8
#include "stdio.h"
int main(){
int number = 10;
int *ptr_number = &number;
printf("%p\n",&(*ptr_number)); //*ptr_number -> &number. &(*ptr_numer) == &number
printf("%p\n",&ptr_number);
return 0;
}

0x02 定义

指针变量的申明格式:
     指针变量的类型 * 指针变量名 = 初始值;

* 的位置可以有下面三种写法:
     int *p;
     int * p;
     int* p;

运算符:
     取值运算符: &
     间接寻址运算符: *

0x03 指针的算数运算

加上整数 / 减去整数
两个指针相减
指针比较
++ 和 - -
当指针进行运算时,移动的单位是sizeof(指向变量的类型)
    (如,int * 一次移动sizeof(int)字节)
    (如,double * 一次移动sizeof(double)字节)

0x04 const 关键字

const 是C语言的一个关键字,它限定一个变量不允许被改变,使用const在一定程度上可以提高程序的安全性和可靠性
const 可以修饰普通变量和指针变量,修饰变量时,位置不同执行的结果也不同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//demo
#include "stdio.h"
int main(){
int a1 = 10;
const int a2 = 10;
a1 = a2; //right a1是普通变量
a2 = a1 //error a2被const修饰,它限定变量a2不允许被改变

const int *b1 = &a1;
b1 = &a2; //right 给b1赋一个内存地址
*b1 = a2; //error 由于关键字const在*号的左边,它限定不能改变的是指针b1执行的地址的值

int * const c1 = &a1;
b1 = &a2; //error 由于关键字const在*号的右边,它限定不能改变的是指针c1的地址
*c1 = a2; //right

return 0;
}

0x05 数组和指针

数组和指针大多情况下,可以互相混用,用操作数组的方式操作指针也是可以
数组变量其实就是一个常指针,是数组的首地址

数组和指针的区别:
1.sizeof 的区别,指针是4(取决于计算机字长,32位计算机就是4),数组 = 元素的大小 * 元素的个数
2.数组是常量指针,只能在声明是赋值,不能再次赋值,指针可以多次赋值
3.语法上,数组不能做函数的返回值,而指针可以
4.数组做参数时,一般要指定数组的长度;而指针做参数时,一般指定指针的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdio.h"
int main(){
int i = 0;
int arr[10] = { 0 };
int *p_arr = &arr;
for( i = 0; i < 10; i++ ){
arr[i] = i;
}
for( i = 0; i < 10;i++ ){
printf("%d ", *p_arr + i);
}
return 0;
}

reslut: 0 1 2 3 4 5 6 7 8 9