C语言指针资料汇总

一、标准指针

指针类型的大小由系统的编译器位数决定,32位编译器占4个字节,64位编译器占8个字节。指针的类型,就代表存储的数据类型,影响寻找多长字节的数据。

指针的值(即地址)应属于下列4种状态之一:
(1)指向一个对象
(2)指向紧邻对象所占空间的下一个位置
(3)空指针,意味着指针没有指向任何对象
(4)无效指针,也就是上述情况之外的其他值
对所有的指针变量进行显式的初始化是种好的做法。初始化的方法有:(1)使它指向现有的内存;(2)给它分配动态内存。
一般来说,指针都是初始化为NULL的,但对NULL指针进行解引用会出现错误。因此,在对指针使用前,先要保证其不是NULL。通常的指针初始化做法为:

int *pnum = NULL;
int num = 0;
pnum = #

在为指针动态分配内存时,需注意使用后的内存释放和指针悬空操作,如:

char *p = NULL;  
p=(char *)malloc(100);  
if(NULL == p)
{
   
     
    printf("Memory Allocated at: %x\n",p);  
}
else
{
   
    
    printf("Not Enough Memory!\n");  
} 
free(p);  
//下一行给指针置空必不可少,否则很可能后面操作了这个野指针而不自知
//从而导致出现严重的问题
p = NULL;  

动态内存分配

C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用的内存池。动态分配的内存没有以任何方式进行初始化。如果对这块内存进行初始化非常重要,要么手动对它进行初始化,要么使用calloc函数进行初始化。
两个函数的原型为:
void *malloc(size_t size);
void free(void *pointer);
malloc所分配的是一块连续的内存。如果操作系统无法向malloc提供更多的内存,malloc就返回一个NULL指针。因此,对每个从malloc返回的指针都进行检查,确保它并非NULL是非常重要的
free的参数必须要么是NULL,要么是一个先前从malloc,calloc或realloc返回的值。向free传递一个NULL参数不会产生任何效果。
calloc和realloc是另外两个内存分配函数。两个函数的原型为:
void *calloc(size_t num_elements, size_t element_size);
void realloc(void *ptr, size_t new_size);

malloc和calloc之间的主要区别是后者在返回指向内存的指针之前把它初始化为0,这个初始化常常能带来方便。其另外一个较小的区别是它们请求内存数量的方式不同。
realloc函数用于修改一个原先已经分配的内存块的大小。使用这个函数,你可以使一块内存扩大或缩小。如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上。因此,在使用realloc之后,你就不能再使用指向旧内存的指针,而是应该改用realloc所返回的新指针。

动态内存分配最常见的错误就是忘记检查所请求的内存是否成功分配。动态内存分配的第二大错误来源是操作内存时超出了分配内存的边界。
一种很少引起错误的内存分配器的程序如下,其分为3个文件实现:

// alloc.h 定义一个不易发生错误的内存分配器
#include <stdlib.h>
#define malloc 不要直接调用malloc
#define MALLOC(num, type) (type*)alloc((num) * sizeof(type))

extern void *alloc(size_t size);
// alloc.c 不易发生错误的内存分配器的实现
#include <stdio.h>
#include "alloc.h"
#undef malloc

void *alloc(size_t size)
{
   
   
	void *new_mem;
	// 请求所需的内存 并检查是否分配成功
	new_mem = malloc(size);
	if (new_mem == NULL)
	{
   
   
		printf("Out of memory!\n");
		exit(1);
	}
	return new_mem;
}
// a_client.c 一个使用很少引起错误的内存分配器的程序
#include "alloc.h"

void function()
{
   
   
	int *new_memory;
	new_memory = MALLOC(25, int);
	// ...
}

释放一块内存的一部分是不允许的,动态分配的内存必须整块一起释放。不要访问已经被free函数释放了的内存。这种情况多发生在对动态分配的内存的指针进行复制的情况中。
在C语言中,调用malloc和free内存非常耗时,因此在实际使用中,尽量避免过多使用malloc和free函数。大型项目一般是调用一次malloc分配一块超大堆区内存(如4GB),然后使用自编函数,每次从中获取一块内存,而不是使用malloc。这种方式需要技术实力…

指针操作

指针就是一个保存地址的变量,因此对其进行memset操作是没有意义的。

C语言的指针运算只限于两种形式:
(1)指针±整数,标准定义这种形式只能用于指向数组中某个元素的指针。(让指针指向数组最后一个元素后面的那个位置是合法的,但对这个指针执行间接访问可能会失败。)如:

#define N_VALUES 5
float values[N_VALUES];
float *vp;
for 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值