前言
通过指针的概念,作用,以及常用的几种指针(指针数组 二级指针、函数指针、void *、数组指针)对指针进行总结
一、指针的概念
1、指针:地址形象化描述,内存单元编号。
指针表示:用十六进制表示
8根地址线:
0000 0000 — 1111 1111
0x00 0x01 0x02–0xff
32根地址线:
0000…0000----1111…1111
0x00000000 0x00000001–0xffffffff
2、指针是高级工具,操作数据(指针是手段,数据是目的)
3、指针变量:存放指针的变量
int *p1 = NULL;
char *p2 = NULL;
short *p3 = NULL;
案例1:给内存单元编号为0x7f008820的空间存入一个整数0x6f00;
*(volatile unsigned int *)0x7f008820 = 0x6f00;
#define data1 *(volatile unsigned int *)0x7f008820;
int data2 = 0;
data1 = 0x6f00;
int *p = NULL;
p = 0x7f008820 ;
*p = 0x6f00;
int data2 = 0;
int *q = NULL;
q = &data;
*q = 23;
二、指针作用:
1、主函数“传递”多个数据给子函数,如何实现--通过指针实现
数组--》传递数组起始地址和有效元素个数
链表--》传递头指针
字符串--》传递起始地址
2、子函数“传递”多个数据给主函数,通过指针实现
主函数申请多个空间,将起始地址传递子函数,子函数中通过指针移动存入多个
数据,依次达到“返回”的目的。
3、动态申请、使用和释放空间需要使用指针
4、c依靠指针处理字符串
三、四大指针
1、指针数组
是一个数组,数组每项存放指针
处理多个字符串情况需要指针数组
2、 void*
1、使用案例
void *malloc(size_t size);
void free(void *ptr);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
内存管理函数
void *memset(void *s, int c, size_t n);(内存块赋值)
void *memcpy(void *dest, const void *src, size_t n);(内存块拷贝)
void *memmove(void *dest, const void *src, size_t n);(内存块拷贝,空间可重复)
2、使用特点
含有void *参数的函数:处理数据不区分类型,按照字节处理
功能具有公共性
3、特性
含有void *参数的函数,都配备一个表示大小的参数(以字节为单位)
4、含有void *参数的函数的实现过程:
(1)将void *转为char *
(2)依次操作每个字节
void *memset(void *s, int c, size_t n){
char *st = (char*)s;
for(int i = 0; i < n; i++){
*(st+i) = c;
}
return st;
}
3 、函数指针:
1、研究指针的目的是通过指针操作数据,指针是手段,数据是目的
2、研究函数指针的目的是通过函数指针调用函数
函数a作为函数b的参数
3、函数指针变量:通过函数指针调用函数
定义函数指针变量:由函数接口决定
定义:返回值类型(*指针变量名)(形式参数类型列表) = NULL;
指向:指针变量名 = 函数名;
使用:调用函数:(*指针变量名)(实参列表);
案例:函数声明:
int add(int a,int b);
函数指针变量定义:
int (*p)(int,int) = NULL;
p = add;
调用:
res = (*p)(3,4);
4、typedef 返回值类型 (*类型名)(形式参数变量列表);
类型名 指针变量名 = NULL;
5、作用:解决函数作为函数参数这种情况
6、了解:函数指针数组:
定义:返回值类型(*指针变量名[10])(形式参数类型列表) = {NULL};
4 、二级指针:
1、概念:
(1)指向指针的指针:指针指向的空间不存放数据,存放的是地址
int data = 0; int *p = &data; int **q = &p;
(2)典型的二级指针:
指针变量的地址是一个二级指针
指针数组名是一个典型的二级指针
(3)通过二级指针操作数据
2、作用:
(1)内存二级分配
char *strs[10] = {NULL};
for(int i = 0; i < 10; i++){strs[i] = malloc(sizeof(char)*50);memset();}
改变:
char **strs = (char**)malloc(sizeof(char*)*10);
for(int i = 0; i < 10; i++){strs[i] = malloc(sizeof(char)*50);memset();}
(2)指针数组名作为函数的参数时,形式参数是二级指针
mian函数传参int main(int argc,char*argv[])
(3)通过函数的形式参数返回一个指针,需要使用二级指针
给main函数传递参数
1、 main函数接口
int main(int argc,char *argv[])
{
return 0;
}
2、参数含义:
argc:存放命令行输入的字符串的个数
argv[0] -- 指向第一个字符串
argv[1] -- 指向第二个字符串
5、数组指针
int array[4][5] = {0};
int (*p)[5] = NULL;
p = array;