C语言指针篇二

C语言指针篇一介绍 如何用&取地址,指针变量的定义,p 和 * p的关系,数组是特殊的指针,const+指针等,地址:https://editor.csdn.net/md/?articleId=104021048
C语言指针篇二介绍 *p, *(p+1),*p+1的关系,以及指针的动态内存分配,地址:
https://editor.csdn.net/md/?articleId=104056784

*p, *(p+1),*p+1都是啥关系?

1.首先,我们都是通过如下方式定义并赋值一个指针变量

#include<stdio.h>
int main()
{
	char* p;
	char i=10;
	p=&i;
	printf("0x%p \n",p ); //地址
	printf("%d \n",*p); //值
 }

char* p,表示定义了一个char* 地址型变量p,当p被赋值:p=&i,p就等于i的地址值.
在这里插入图片描述
地址是16进制数。
2.拿数组来说,当*p指向数组ac[]={10,2,3,4,5,-1},p=ac,其实是指向数组第一个元素的存储位置,与p=&ac[0]意思相同。这里不必写成p=&ac,因为数组在C语言中本身就是一种特殊的指针。直接写p=ac,就代表指向数组第一个元素。
3.当给指针赋地址变量之后,即语句p=ac之后,p就是地址, * p就是值。
详见:C语言指针篇一 https://mp.csdn.net/postedit/104021048
给指针赋地址变量之后,就可以改变值,比如,int i=2;int * p; p=&i; * p=15;这时候 i 的值就变成15.
在给指针赋地址变量之前,不要直接赋值,比如,int * p; * p=15;可能不会报Warning,但是不能输出结果。int * p; p=15;这样直接赋地址也不能输出结果。
4.总之,给 *p赋地址变量之后,*p就是一个值。对应上面的数组,*p=10
*(p+1)是下一个地址变量的 值,2;p+1是下一个地址变量的地址,变量类型是int ,就加一个sizeof(int)=4,变量类型是char ,就加一个sizeof(char)=8
*p+1就是在这个值上加1 *p+1=11

#include<stdio.h>
int main()
{
	char ac[]={10,2,3,4,5,-1};
	char *p=ac;
	printf("*p=%d\n",*p);
	printf("*(p+1)=%d\n",*(p+1));
	printf("*p+1=%d\n",*p+1);
	//printf("p=%p\n",p);
	
	/*printf("&ac=%p\n",p);
	for (p=ac;*p!=-1;p++)
	{
		printf("%p\n",p);
	}*/
}

在这里插入图片描述

动态内存分配

例1

#include<stdio.h>
#include<stdlib.h>
int main()
{
int number;
int *a;
int i;
printf("输入数量:");
scanf("%d",&number);
a=(int*)malloc(number*sizeof(int)); //动态内存分配 直接定义内存在哪
//malloc在跟系统要内存
//返回类型void*单字节类型,所以要 number*sizeof(int)个字节
//返回类型是void* 强制转换成int* 
for (i=0;i<number;i++)
{
	scanf("%d",&a[i]);
	
}
for (i=number-1;i>=0;i--)
{
	printf("%d",a[i]);
}
free(a);
//和malloc配套 
return 0;	
}

例2

#include<stdio.h>
#include<stdlib.h>
//计算电脑能分配多大内存空间 
int main()
{
	void *p;
	int cnt=0;
	while( (p=malloc(100*1024*1024)) )//100M
	{
		cnt++;
	}
	printf("分配了%d00M的空间\n",cnt);
	return 0; 
}

在这里插入图片描述
这里没有free,实际上每次程序关掉,系统自动就会free用过的内存。
但是当你的程序需要过多次分配内存,并且从来没有free的情况下,内存会不够用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值