C-空类型指针
空类型指针malloc 查看底层源码中发现是空类型的指针,空类型的指针可以接收任意类型的指针,但是不能取出指针里的内容,如果要取出内容必须要强转。
1.验证空类型指针,可以接收任意类型指针,但不可以取值1234567void testVoidPoint() { int a = 100; void *p = &a; printf("%x, %x", &a, p); printf("%d", *p); //error: invalid use of void expression getchar();}
2.通过强转取值将值强转成对应的指针类型取出
12345void testVoidPoint2() { int a = 100; void *p = &a; printf("%d", *((int*)(p)));}
3.开辟空间,证明指针即是动态数组1234567891011void testVoidPoint3() ...
C-使用 molloc 手动开辟内存
前言手动开辟内存 主要使用的函数 molloc 进行操作。开启指定的内存空间。
123456while (1) { printf("%s", "自增内存"); //开10兆内存,并地址给一个指针。 int *p = (int *)malloc(1024 * 1024 *10 ); Sleep(2000);}
malloc 无效可能是杀毒软件拦截的原因。malloc 用来创建动态的数组也是数组,跟普通的数组有什么区别呢:
普通的数组是已知大小的情况下使用,malloc 的数组是在大小不确定的情况下使用,可以动态的分配指定大小,灵活度大。
C-指针的初始化
前言必须初始化才可以使用,未经初始化的指针会产生一个垃圾数据,这个数据是胡乱读取到的。不初始化先危险
初始化反例使用指针必须初始化,否则报错。
123int *p;//错误,必须先初始化*p = 5;
NULL 空指针在 stdio.h 头文件中 NULL 是常量,表示不指向任何地址。if point == NULL 判断指针有没有被使用过。
1234//表示内存为 Ox000000;int *p//访问冲突,0x000000 是操作系统使用的。= NULL;*p = 5;
VS 会报错,未经初始化的变量,但是有的IDE是不会报错的。
C-指针类型不兼容
类型不兼容不同类型的指针不可以赋值。否则赋值后,编译可以通过,但是执行后数据会变量错误数据。
1234567int a = 32138;//合法int *p = &a;//合法,但是问题就在这里char *p1 = p;printf("%d,%d", *p, *p1);printf("\n%d,%d", sizeof(*p), sizeof(*p1));
指针都是4个字节存,这个没问题,问题在取,取的时候根据什么类型,就会读多大的长度,如果是 int *则会读4个字节,如果是 char *类型,则只会读一个字节,数据错误。
在 vs 上重现不出来,vs 直接报 类型不兼容。
C-一级指针简单理解
两个关键符号&: 取内存地址符*: 取内存值符
指针的操作规律
1.声明的时候是往里放地址 int *p = &num,2.直接拿的时候就是直接操作地址内的值 *p = 10;
在 C 中操作地址就可以操作值,就跟 java 中两个引用类型拿到引用可以操作内一个对象一样。
123变量名 内存地址 值a [0x23fa32] 100*p [0x24aa34] [0x23fa32]
指针存放的是 a 的内存地址,&p则是自己的内存地址 [0x24aa34]
创建一个针指并使用12345678void main() { int num = 100; //将内存地址给 *p int *p = # printf("%x, %x",&num, &p); *p = 10; printf("%d", num); //10}
分析过程:根据拿到的直址 分别查看 &num,和 &p。&num 的地址以 带符号 4 ...