数组指针

一、数组指针:

《1》数组
从内存角度来说,数组是一片连续的内存空间,用来存放相同的数据类型元素;
《2》了解

int a[100]={0};//编译期间 赋值为0, 速度快
memset( a , 0 , sizeof(a) );//手动赋值,速度次之俄回收内存,也为了有机会让编译器拿到原始内存地址,编译器将a做为const量,也就是说,不可改变a
//如:a=oxff11;这是错误的
//在定义a[100]时,编译器会自动分配内存,为了能够顺利d

《3》数组的解释

 int array[10]={1,2,3,4,5,6,7,8,9,0};
 //数组名array退化为数组首元素地址,不是整个数组的地址
 // 数组名取地址,&array代表整个数组的地址;
 //&array和array代表的数据类型不一样,其步长也就不一样(加 1 的效果不一样)
 //&array代表数组类型,array代表数组首元素类型

《4》数组类型

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
    int i;
    int a;
    typedef int (Array)[5];
    Array array;
    for(i=0;i<5;i++)
    {
        array[i]=i;
    }
    for(i=0;i<5;i++)
    {
        printf("%d\n",array[i]);
    }
    printf("%d\n",sizeof(array));//求数组的大小

    printf("%d\n",sizeof(Array));//求数组类型的大小

    printf("%d,%d\n",&array,&array+1);//查看步长 

    system("pause");

}

《4.1》typedef int (Array)[6];
图一

《4.2》typedef int (Array)[5];
图二

《5》数组指针的三种定义方式

//定义数组指针有三种:

//1)通过数组类型定义数组指针: 
typedef int(ArrayType)[5];
ArrayType* pointer;

//2) 声明一个数组指针类型 :
typedef int (*MyPointer)[5];
MyPointer myPoint;

//3)直接定义:
    int (*pointer)[n];  
    pointer 为数组指针变量名
    type    为指向的数组的类型
    n       为指向的数组的大小
注意这个地方是type类型(比如 int (*pointer[10]

程序实现:

#include<stdio.h>//三种方式的头文件均定义与此
#include<stdlib.h>
#include<string.h>

(1)第一种定义数组指针的方式

void main()
{
    int i;
    int a;//引例,定义整形变量a
    int *p=&a;  //定义整形指针变量p,将a的地址赋给p

    typedef int(MyArray1)[5];//使用typedef声明一个数组类型;
    int a1[5]={1,2,3,4,5};//定义一个整形数组 a1
    MyArray1* parra = &a1;//定义一个数组指针变量parra,将a1的地址赋给它
//注意parra用于存放一级指针的地址,故而是一个二级指针
    for(i=0;i<5;i++)
    {
        (*parra)[i]=i;//通过数组指针,来初始化
    }
    for(i=0;i<5;i++)
    {
        printf("%d\n",(*parra)[i]);//打印每次初始化结果
    }

    system("pause");
}

图三
(2)第二种定义数组指针的方式
我们知道,可以通过直接定义指针类型,来定义指针变量,如结构体中,

typedef struct _teacher
{
    char name[64];
    int age;
}teacher,*pteacher;
//在主调函数中,可以直接利用*pteacher来定义指针;如:

ptecher p1;

那么能否适用于数组指针呢? 下面,我们来看一看:

void main()
{
    int i;
    int b[5]={1,2,3,4,5};
    typedef int (* Pmyarrb)[5];//声明数组指针类型
    Pmyarrb pb = &b;//用已声明的数组指针类型定义指针变量pb,再将b的地址赋给该指针

 for(i=5;i<10;i++)
   {
    (*pb)[i]=i;
   }

   for(i=5;i<10;i++)
   {
       printf("%d\n",(*pb)[i]);
   }
system("pause");
}

图四
(3)第三种定义数组指针的方式,企业中最常用

void main()
{
    int i=0;
    int c[5]={1,2,3,4,5};
    int (*parrc)[5]=&c;//在定义数组类型的同时将某块空间的地址赋给它
       for(i=10;i<15;i++)
   {
     (*parrc)[i]=i;
   }

   for(i=10;i<15;i++)
   {
     printf("%d\n",(*parrc)[i]);
   }
   system("pause");
}

图五

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值