数组和指针的关系

Int Arr[5]={9,8,7,6,5};
Int *ptr;
Ptr=&ARR[0];
此时:

for(i=0;i<5;i++) 
{
printf (“%d”,*ptr);
	ptr++;
}

For(i=0;i<5;i++) printf (“%d”,Arr[i]);

是等效的
任何时候,数组都可以用ptr=&arr[0]的形式转换为指针。特别在多维数组(如二维数组arr[5][3],5*3矩阵)的操作中能带来很大方便
取矩阵最大值:

Int *ptr;
Ptr=&arr[0][0];
Maxvalue=0;
For(i=0;i<5*3;i++) 
{
if (*ptr>maxvalue) maxvalue=*ptr;
Ptr++;
}

变量定义区(Data段和BSS段):可以看作在内存中单独划出的空间,用于存储全局变量定义,系统自动分配空间
内存区:图中的堆(heap)区,存放数据的空间,需要通过程序代码申请。
运行时内存如下图:
在这里插入图片描述在这里插入图片描述
以下是查看内存地址分配的程序:

#include <stdio.h>
#include <stdlib.h>
int g1=0, g2, g3=0;
int a[10],b[5]={1,2,3,4,5};
int *gp;
void outmsg(char *s,int *addr)
{
    printf(s);
    printf("      ");
    printf("0x%08x\n",addr);
}

int max(int i)
{
    int m1=0,m2,m3=0,*p_max;
    static int n1_max=0,n2_max,n3_max=0;
    p_max = (int*)malloc(sizeof(int)*10);   //申请存储空间
    outmsg("max程序地址",(int *)max);
    outmsg("max传入参数地址",&i);
    outmsg("max函数中静态变量地址static n1_max=0",&n1_max);
    outmsg("max函数中静态变量地址static n2_max",&n2_max);
    outmsg("max函数中静态变量地址static n3_max=0",&n3_max);
    outmsg("max函数中局部变量地址int m1=0",&m1);
    outmsg("max函数中局部变量地址int m2",&m2);
    outmsg("max函数中局部变量地址int m3=0",&m3);
    outmsg("max函数中存放p_max地址的空间的地址",(int *)&p_max);
    outmsg("max函数中局部变量地址int *p_max malloc",p_max);
    if(i) return 1;
    else return 0;
}

int main(int argc, char **argv)
{
    static int s1=0, s2, s3=0;
    int v1=0, v2, v3=0;
    int *p;
    gp = (int*)malloc(sizeof(int)*10);  //申请存储空间
    p = (int*)malloc(sizeof(int)*10);  //申请存储空间

    outmsg("全局变量(已初始化)的内存地址int g1=0",&g1);
    outmsg("全局变量(未初始化)的内存地址int g2",&g2);
    outmsg("全局变量(已初始化)的内存地址int g3=0",&g3);
    outmsg("全局变量(未初始化)的内存地址a[0],int a[10]",&a[0]);
    outmsg("全局变量(未初始化)的内存地址a[1],int a[10]",&a[1]);
    outmsg("全局变量(已初始化)的内存地址b[0],int b[5]={1,2,3,4,5}",&b[0]);
    outmsg("全局变量(已初始化)的内存地址b[1],int b[5]={1,2,3,4,5}",&b[1]);
    printf("======================\n");
    outmsg("程序初始程序main地址",(int *)main);
    outmsg("主参地址argv",(int *)argv);
    outmsg("主参地址argc",&argc);
    outmsg("main静态变量地址static int s1=0",&s1);
    outmsg("main静态变量地址static int s2",&s2);
    outmsg("main静态变量地址static int s3=0",&s3);
    outmsg("main局部变量地址int v1=0",&v1);
    outmsg("main局部变量地址int v2",&v2);
    outmsg("main局部变量地址int v3=0",&v3);
    outmsg("main存放p地址的空间的地址",(int *)&p);
    outmsg("main局部变量地址int *p malloc",p);
    printf("======================\n");
    max(v1);
    printf("======================\n");
    outmsg("存放全局变量gp地址的空间的地址",(int *)&gp);
    outmsg("全局变量地址int *gp malloc",gp);
    return 0;
}

结果如下:
在这里插入图片描述
如果我们把变量比作储物柜,数值比作快递物品,有变量a和数值100
一、当储物柜能容纳物品时,我们把物品直接放入储物柜,步骤如下:(普通变量)
1.申请4字节的储物柜,即 int a; 如果是字符,则申请1字节
2.把物品放入储物柜,即 a=100;
二、当同一物品很多时,我们需要申请同样大小的储物柜n个:(数组)
1.申请10个4字节大小的储物柜,int a[10];
2.依次放入物品: for(i=0;i<10;i++) a[i]=100;
三、当物品很大或不规则,无法放入储物柜时,储物柜里是一张取物凭证:(指针)
1.申请容纳物品的任意储物区域:int a=100
2.申请4字节的储物柜, 放入取物凭证(地址为长整型需4字节存放)int *ptr;
无论是int *ptr,string *ptr,char *ptr都是占用4个字节,因为ptr存储的只是地址
3.根据取物凭证收货: ptr =&a 或 int *ptr=&a
这个公式有两种说法:
1)ptr存放的是a的地址
2)ptr是指向a的指针,是一个意思
指针赋值只能是ptr=&a(即地址) 和ptr1=ptr2(即指针=指针)形式,空指针:ptr=0
四、当物品很多并陆陆续续进来时,无法确定储物柜数量,则在每次新物品来时都申请新储物柜,并在上次最后一个储物柜放入新储物柜地址,这样后续的每个储物柜都有一个物品和一张指向下个储物柜地址的凭证,最后一个凭证是0表示结束。

数组和链表的区别:
1.数组必须是连续的内存空间,链表可以不连续,连续空间是有限的,所以对大量的数据只能用链表
2.数组删除或插入一个元素,后续的元素全部要向前/向后移动,链表只要把地址指针直接指向下下个节点就行,比如上表要删除b,只需将a后面的3改成6,插入也同理
3.链表比数组多占用空间(放向前和向后的指针)
4.链表一般要自己用代码维护插入、删除、内存申请等事件
5.链表如果含向前和向后两个指针,就可以从任意节点向前/向后获取其他节点数据,上表只有向后指针,只能向后搜索

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值