加入CSDN是出于记录,希望有不足之处多加指正。
1、char 指针
字符指针
char * p = "helloworld" ;
以上写法“helloworld”被存放与常量区中,可以被访问,不可以被修改;(只读数据)
2、多级指针
int a = 100 ;
int * p = &a; //一级指针,P指向a的地址
int **p1 = &p; //二级指针,p1指向指针p的地址
int ***p2 = &p1; //三级指针, p2指向二级指针p1
运行结果:
3、万能指针的拆解方法:
任何的指针不管有多复杂,拆解的时候都是拆分成两部分
char * p1; //第一部分指针变量名 *p1 ,第二部分指针所指向指针的类型char
char ** p2; //第一部分 *p2 ,第二部分 char *
char (*p3)[3]; //第一部分 *p3,第二部分 char [3],指向数组的指针,数组指针
char (*p4)(int , float); //第一部分 *p4, char(int , float),,,
注意:
以上的p1,p2,p3,p4都是一个指针本质上没有任何区别。
以上指针的唯一不同点在于他们所指向打数据类型不同。
4、void 指针
概念:还没有明确指针所指向的时候可以使用 void 指针(通用类型指针)
注意:
- void 型指针不可以直接用来索引目标,必须再把它进行强制类型转换再索引,才能获得正确的目标数据。
- void型指针无法直接进行加减运算。
void 关键字修饰的三个作用:
- 修饰指针,表示该指针所指向的类型是未知的。
- 修饰参数列表,表示该函数不接受任何参数。
- 修饰返回值类型,表示该函数不会有任何返回值。
void function(void);
以下代码知识作为实验了解 void 型指针的使用,实际开发中不要使用
// malloc 向系统申请一片内存大小为 4 字节,并让 p 来指向该内存
void * p = malloc (4);
*(int *)p = 25536 ; //强制类型转换为 int *
printf("%d\n" , *(int *)p); //使用正确的解析方法来解析内存可以得到正确的值
printf("%d\n" , *(char *)p); //使用错误的解析方法来解析内存可以得到错误打值
5、const 型指针
用来修饰指针有两种形式:
1.常指针
const 修饰的是指针本身,表示P不能被修改,只能指向原本所指向打内容。
但是可以通过该指针来修改他所指向的内存内容。
// 常指针
char * const p = "hello";
printf("%s\n", p);
p = "world"; //错误,p是一个常指针,不能够再初始化后再修改他的指向
printf("%s\n", p);
#include <stdio.h>
int main(int argc , char const *argv[])
{
int n = 200;
int m = 300;
int *const p = &n;
//p = &m 错的,不可以指其他地址
*p = 400; // 可以通过改指针修改它指向的内存内容
printf("%d\n", *p);
return 0;
}
2.常目标指针
比较常见,用来限制指针的读写权限,不可以通过该指针来修改他所指向打内存的内容,但是可以修改他的指向。
int a = 100;
int b = 998;
const int * p = &a;
printf("%d\n" , *p);
p = &b; //常目标指针可以修改他的指向但不能通过他来修改内存打内容
// *p = 200; //错误,p是一个常目标指针,不可以通过该指针来修改他所指向打内容
printf("%d\n" , *p);