指针
什么是指针?
指针是一个保存地址的变量
指针的定义:
1、定义一个指针变量p,类型是int*。
2、p指向一个int型的数据
(涉及的指针符号:* &)
int *p;
指针的绑定:
p = &a;
printf("a = %d.\n", a);
int *p1 = &a;
printf("p1 = %p.\n", p1);
1、直接指向内核区
2、指向可用也没有别的数据的区域
3、指向可用但有别的数据的区域。
//二维数组, 变量名:首元素首地址{arr[0], arr[1]}
//arr &arr[0] &arr[0][0]
//arr代表数组首元素首地址(&arr[0])
//&arr[0]代表第一维数组的首元素首地址
//&arr[0][0]代表数组的第二维数组是首元素首地址
类型一:
int const *p1;
p1 = &a;
*p1 = 11; // 错误 error: assignment of read-only location ‘*p1’
类型二:
2,
const int *p2; // p2所指向的数据(int)不能改变,等同于p1
类型三:
3,
int * const p3; // 野指针,const修饰p3,p3不可改.但是p3所指向的内容可改变
类型四:
4,
const int *const p4; // 定义时同时初始化,两者都不能变
typedef是重命名的关键字,他不是发明新类型,而是给类型起了一个新外号
//这就表示一个类型,p_func是一个类型的名字, 函数指针
typedef void (*p_func) (void);
//函数指针数组:数组里面的元素都是指针(函数指针)
typedef void (*p_arr[10])(void);
int *p = NULL;
p = (int *)malloc(num * sizeof(int));
printf("malloc error.\n");
return -1;
}
释放堆内存:
//1、整个程序结束,会自动释放堆内存
//2、申请一次,释放一次,不能多次释放
free(p);
p = NULL;
//3、释放的堆内存必须是这块内存的首地址
什么是指针?
指针是一个保存地址的变量
指针的定义:
1、定义一个指针变量p,类型是int*。
2、p指向一个int型的数据
(涉及的指针符号:* &)
int *p;
指针的绑定:
p = &a;
指针的解引用:
*p得到了变量(a)。
*p = 23;printf("a = %d.\n", a);
定义指针的同时并且初始化:
int *p1 = &a;
等同于:
int *p, a;
p = &aprintf("p1 = %p.\n", p1);
NULL专用于指针的初始化(写0)
int *p = NULL
野指针的危害?
1、直接指向内核区
2、指向可用也没有别的数据的区域
3、指向可用但有别的数据的区域。
二维数组指针:
//二维数组, 变量名:首元素首地址{arr[0], arr[1]}
//arr &arr[0] &arr[0][0]
//arr代表数组首元素首地址(&arr[0])
//&arr[0]代表第一维数组的首元素首地址
//&arr[0][0]代表数组的第二维数组是首元素首地址
const
const修饰的变量不能改变,只能初始化一次
类型一:
int const *p1;
p1 = &a;
*p1 = 11; // 错误 error: assignment of read-only location ‘*p1’
类型二:
2,
const int *p2; // p2所指向的数据(int)不能改变,等同于p1
类型三:
3,
int * const p3; // 野指针,const修饰p3,p3不可改.但是p3所指向的内容可改变
类型四:
4,
const int *const p4; // 定义时同时初始化,两者都不能变
typedef
typedef是重命名的关键字,他不是发明新类型,而是给类型起了一个新外号
//这就表示一个类型,p_func是一个类型的名字, 函数指针
typedef void (*p_func) (void);
//函数指针数组:数组里面的元素都是指针(函数指针)
typedef void (*p_arr[10])(void);
malloc动态数组
堆空间的申请
int *p = NULL;
p = (int *)malloc(num * sizeof(int));
判断申请空间是否成功
if (NULL == p)
{printf("malloc error.\n");
return -1;
}
清空这段内存
memset(p, 0, num*sizeof(int));
释放堆内存:
//1、整个程序结束,会自动释放堆内存
//2、申请一次,释放一次,不能多次释放
free(p);
p = NULL;
//3、释放的堆内存必须是这块内存的首地址