C语言之指针

指针2

数组指针:指向数组的指针(数组指针相当于一个二级指针)

定义:元素类型(*数组指针名)[列数n];
指针指向列数为n的一维数 组
int(*p)[4];

赋值:1.一维数组名的地址
2. 二维数组名

int n[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int(*p)[4] = n;//int(*p)[4]=&n[0];

定义了一个数组指针p指向这个3行4列的二维数组

数组指针的偏移:

p+1:偏移一行
P++;本身指向偏移一行
P[n];=*(p+n);

内存区域的划分:
C语言程序中,代码是放在内存中执行的,我们大致将程序所占用的内存分为四个区域:栈区 堆区 数据区 代码区
根据是局部变量,全局变量,常量还是其他,通过malloc等类似的函数分配内存空间,把他们放到对应的内存区中,这样就赋予了这些变量或常量不同的生命周期。
根据我们程序的需要,我们在编写代码过程中,声明不同的变量类型,使他们有不同的声明长度,不同的释放方式,可以让我们更加灵活地编程。

  1. 栈区
    由编译器自动分配释放,比如存放函数的参数值,局部变量等。
    例如:
void recive(int a,int b) {
    int c;}

其中,参数a,参数b和变量c都是存放在栈区,当函数执行完毕的时候,它们占有的空间自动释放。
2. 堆区
一般由程序员分配释放(如动态内存申请<malloc函数>),若程序员不释放,程序结束时可能由操作系统回收。
例如:

char *src;
src = (char*)malloc(4 *sizeof(char));//动态分配内存,表示查找可用的连续4个字节内存的空间,并将该内存首地址给指针赋值

3.数据区
分为两种:
1、常量区:存放常量,一般是字符串常量。
2、全局区(静态区):存放全局变量(定义在函数外的变量)和静态(static)变量。
该区域是在程序开始时分配内存,程序结束后由操作系统释放。
4.程序代码区
这个区域存放函数体的二进制代码,也是由操作系统进行管理。

c语言申请内存和释放:

//1.形参:申请的字节数 2.返回值:申请内存的首地址
void *malloc( size_t size );
//函数指向一个大小为size的空间,如果错误发生返回NULL。 
存储空间的指针必须为堆,不能是栈。
int*p = (int *)malloc(100 * sizeof(int));//给p分配100个int大小的内存
举例:
int*p = (int*)malloc(10 * sizeof(int));//定义了一个int*的指针p,给p分配10个int大小的内存
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", p + i);//for循环给这个10个空间存放值
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", p[i]);
	}
	free(p);//释放
	p = NULL;//置空

void *calloc( size_t num, size_t size );
//函数返回一个指向num 数组空间,每一数组元素的大小为size。
如果错误发生返回NULLint*p1 = (int *)calloc(100, sizeof(int));//给p1分配100个int大小的内存
举例:
int *p = (int *)calloc(10, sizeof(int));//定义了一个int*的指针p,给p分配10个int大小的内存
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", p + i);//for循环给这个10个空间存放值
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", p[i]);
	}
	printf("%d\n", p);

void *realloc( void *ptr, size_t size );
//函数将ptr 对象的储存空间改变为给定的大小size。 参数size可以是任意大小,
大于或小于原尺寸都可以。 返回值是指向新空间的指针,如果错误发生返回NULL。
p = (int *)realloc(p, sizeof(int)* 50);//直接重新分配50个int大小的内存
举例:
p = (int *)realloc(p, sizeof(int)* 5);//p指向的空间,大小为5*int
	for (int i = 0; i < 5; i++)
	{
		printf("%d\n", p[i]);
	}
	printf("%d\n", p);
	free(p);//释放
	p = NULL;//置空

释放内存:free(内存首地址);
//函数释放指针ptr指向的空间,以供以后使用。指针ptr
必须由先前对malloc(), calloc(), realloc()的调用返回。

free(p);//释放内存
p = NULL;//置空

指针和const结合:const增加稳定性
之前变量和const结合:
const int a = 5;
	a = 6;//会报错,因为不能被改变

常量指针:指针指向一个常量
指向一个被const修饰的变量
Const 类型 * 指针名;
类型 const * 指针名;
指针不能改变指向的内容,但是可以改变指向

int a = 10;
	const int b = 20;
	const int *p = &a;
	// *p = 10;//错误,不能改变指向的内容
	p = &b;//常量指针可以改变指向
	// *p = 10;//错误,不能改变指向的内容

指针常量:指针本身是被const修饰的变量,只读
指向类型 * const 指针名;
必须初始化
指针常量不能改变指向,可以改变指向的内容

int * const p=&n;
int *const p2 = &a;
	*p2 = 50;//可以改变指向的内容
	printf("%d\n", a);
	//p2 = &b;//错误,不能改变指向
	int *const p3;
	//p3 = &a;//必须初始化,不能在定义之后再给指向

区分指针常量和常量指针:
const在之前是常量指针,在后面是指针常量

指针的使用注意:
1.使用指针前指针必须要有指向;
2.指针没有指向和指针指向0内存是两个概念;
3.堆区:malloc/calloc和free,new和delete配套使用.
4.内存泄漏:指针指向的内存没有释放就改变了指向;
(是否能访问到堆区的内存)
5.野指针(坏指针):指针指向的内存释放了,但指针没有置空

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值