加入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);