指向指针的指针可以为0,相当于程序吧二进制字符串当作指针
但是,*(0) 位置在某些情况下真是一个指针。当操作系统访问该地址时,cpu会告诉操作系统该位置不能触碰,出现该内存不能read的报错。
saferFree 会把野指针赋值为0,为了早点发现运行错误。
指针的类型。
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
(1)int *ptr; //指针的类型是int *
(2)char *ptr; //指针的类型是char *
(3)int **ptr; //指针的类型是 int **
(4)int (ptr)[3]; //指针的类型是 int()[3]
(5)int *(*ptr)[4]; //指针的类型是 int ()[4]
我们可以这样理解,一个基本的数据类型(包括结构体等自定义类型)加上” * “号就构成了指针的类型。这个类型定义的变量大小是一定的,与” * “号前面的数据类型无关,” * “号前面的数据类型只是说明指针所指向的内容里存储数据的类型。
->是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.
举个栗子
struct Data
{
int a,b,c;
}; /*定义结构体*/
struct Data * p;/*定义结构体指针*/
struct Data A = {1,2,3};/*声明变量A*/
int x;/*声明一个变量x*/
p = &A ; /*让p指向A*/
x = p->a;/*这句话的意思就是取出p所指向的结构体中包含的数据项a赋值给x*/
/*由于此时p指向A,因而 p->a == A.a,也就是1*/
注意:
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的。(所以源和目的最好不要一样)
4.VS里面memcpy超额完成了,也有memmove的功能
举个栗子
#include <stdio.h>
#include <string.h>
struct {
char name[40];
int age;
} person, person_copy;
int main()
{
char myname[] = "Pierre de Fermat";
memcpy(person.name, myname, strlen(myname) + 1);
person.age = 46;
memcpy(&person_copy, &person, sizeof(person));
printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
return 0;
}