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的情况下,内存会不够用。