本文介绍C高级语言中的指针用法
一、指针的介绍
1.指针的定义
在了解指针之前,我们先了解程序的运行的本质就是操作内存,而指针就是C语言中直接操作内存的一个工具。下面我们再来说指针是什么?在C程序中 "指针" 通常有两个含义:1) 表示内存的地址 ;2) 表示一个 存放内存地址的 变量。而内存的地址: 它实际是一个地址或者指针,它是一个常量,但存放内存地址的 变量: 它实际是一个指针变量 用内存空间。
2.指针变量的表示
指针变量的表示是以 {存储类型 数据类型 变量名} 这个格式.
例如 auto int * p
它的含义是 定义了一个指针变量p, 该变量将会存储 一个地址 该地址 所在的内存 是 int类型
&+变量名 例如 &p 取变量地址运算
指针变量 的 赋值: 指针变量 = 地址常量 或 其他指针变量
3.指针的使用
*指针取值运算符
*指针变量 表示取出 指针变量 指向的 内存中的 值
示例 int *p = &a; *p 等同于 a
字节对齐: int 4字节对齐 表示其地址 一定能被4整数
short 2字节对齐 表示其地址 一定能被2整数
指针 与 整型运算 :
指针 +或- 一个整数: 其结果是一个对应类型的地址
表示 对当前指针 (-)前方对应个数的类型 的地址
表示 对当前指针 (+)后方对应个数的类型 的地址
数组名:
是一个地址 元素类型的地址 元素类型 *
4.指针的存储空间
假设const char *p = "hello"; p指向了一个 常量区域的内存地址
*++p; 表达式的值 为 'e'
char s[]="hello"; char *p = s; p 指向 变量s 的内存地址
(*p)++; 表达式的值 为 'h'
== s[0]++;
== 'h' ; s[]= "iello";
*p++;
5.指针的表示形式
下面列举了一些常用的指针可能会出现的一些形式 ,看这个可以对指针有更清晰的了解。
6.二级指针
二级指针: 即 指 一个指针指向了 另一指针 该指针中存放的是 另一个指针的地址
int a;
int *p = &a;
int **pp = &p; 二级指针定义
指针数组: 即一个数组 中存放的元素 是指针类型 这个数组即指针数组
int *arr[5];
int **p=arr; //二级指针
字符串指针数组:
const char *arr1[3] = {"hello", "world", "你好"};
const char **pp = arr; // 二级指针
二维数组 与 数组指针:
数组指针: 一个指针 指向一个数组 &数组名
int arr[5];
int* p = arr;
int arr[2][3]; 其中一维元素的类型 int [3];
int (*p)[3] = arr; // 数组指针
结果:
7.const关键字
修饰变量 表示该变量 是只读的 不能重新赋值
const char *p = "hello";
char s[] = "hello";
char *p = s;
*p ; 表示*p 可读可写 p是可读可写的
const *p ; 表示*p 只读 p是可读可写的
* constp ; 表示 p 只读 *p可读可写的
const * const p; 表示 p 只读 *p也只读
8.函数
函数:
(1) 函数定义
返回值类型 函数名 (形参列表) { 函数体 }
(2) 函数声明
返回值类型 函数名 (形参列表); // 函数原型
函数5要素:
1) 功能明确
2) 函数原型
3) 参数 作用 传参方式
4) 返回值
5) 注意事项 bug 部分
(3) 函数调用
函数名(实参列表);
(4) 传参
复制传参 实参复制其值 赋值给形参 函数中操作的是形参
地址传参 将实参的地址 赋值给形参(指针类型) 函数可以通过这个指针操作实参
函数类型:
int func(int *a,int *b);
其类型为 int (int *,int *);
如何定义函数指针 : int (*p) (int *,int *);
int arr[3];
int (*p)[3] =&arr;
int *p = arr;
函数名:
1) 代指这个函数
2) 代指这个函数 的 首地址(函数入口地址)
函数指针的使用:
通过该指针调用这个函数 除此外,其他指针操作均不能使用
1) (*函数指针)(参数表)
2) 函数指针(参数表)