文章目录
- 前言
- 一、指针的概念
- 二、指针作用:
- 三、四大指针
- 1、指针数组
- 2、 void*
- 3 、函数指针:
- 4 、二级指针:
- 5、数组指针
前言
通过指针的概念,作用,以及常用的几种指针(指针数组 二级指针、函数指针、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;
