#include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
printf("%#x, %#x\n",a,&a[0]);
return 0;
}
验证a和&a[0]是不是同一个值,验证得出a就是a[0]的地址,a是个常量,它的值不能改变
#include <stdio.h>
void out(int *pa, int len)
{
pa[2]=10;
}
int main(void)
{
int a[5]={1,2,3,4,5};
out(a,5);
printf("%d\n",a[2]);
return 0;
}
修改数组a[2]的值
指针的运算,指针不能相加,不能相乘,也不能相除,如果两个指针变量指向的是同一块连续空间中的不同存储单元则这两个指针变量才可以相减,如下:
#include <stdio.h>
int main(void)
{
int *p;
int *q;
int a[5];
p=&a[1];
q=&a[4];
printf("p和q所指向的单元相隔%d个单元\n",q-p);
return 0;
}
得出3的值
#include <stdio.h>
int main(void)
{
char ch='A';
int i=99;
double x=66.6;
char *p=&ch;
int *q=&i;
double *r=&x;
printf("%d %d %d\n", sizeof(p), sizeof(q), sizeof(r));
return 0;
}
上面是求指针变量所占的空间大小,结果都为8个字节
结论:一个指针变量,无论它指向的变量占几个字节,该指针变量本身只占八个字节
传统数组的缺点
1.数组长度必须事先制定,且只能是长整数,不能是变量
例如:int a[5]; //ok int len=5; int a[len]; //error
第二个缺点如下:
#include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5}; //20个字节的存储空间程序员无法手动编程释放它,只能在本函数运行完毕时由系统自动释放
return 0;
}
3.数组的长度一旦定义,其长度就不能在函数运行的过程中动态的扩充或缩小
4.A函数定义的数组,在A函数运行期间可以被其它函数使用,但A函数运行完毕之后,A函数中的数组将无法在被其它函数使用
malloc是memory(内存) allocate(分配)的缩写
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int i=5;
int *p=(int *)malloc(4);
*p=5;
free(p);
printf("%d\n",sizeof(*p));
return 0;
}
#include <malloc.h>调用malloc函数需要的头文件,int i=5;静态分配了4个字节,int *p=(int *)malloc(4); malloc函数只有一个形参,并
且形参必须是整形,4表示请求系统为本程序分配4个字节,malloc函数只能返回第一个字节的地址,该行分配了12个字节,p变量占8个
字节,p所指向的内存占4个字节,p本身所占的内存是静态分配的,p所指向的内存是动态分配的,*p=5; *p代表的就是一个int变量,只
不过*p这个整形变量的内存分配方式为动态的,free(p); 表示把p所指向的内存给释放掉,p本身的内存是静态的只能由函数自动释放
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int a[5];
int len;
int *p;
printf("请输入你要存放的元素的个数:");
scanf("%d",&len);
p=(int *)malloc(4*len);
return 0;
}
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int a[5];
int len;
int *p;
printf("请输入你要存放的元素的个数:");
scanf("%d",&len);
p=(int *)malloc(4*len);
free(p);
return 0;
}
int a[5]; 因为int占4个字节,本数组共包含20个字节,每四个字节被当作了一个int变量来使用
p=(int *)malloc(4*len); 动态的构造了一个一维数组,该一维数组的长度是len,该数组的数组名是p,该数组每个元素是int类型,类
似于int p[len]; free(p); 释放掉动态分配的数组