菜单

动态数组的构造,小白对c语言数组的基础总结

2020年1月19日 - 4166m金沙
动态数组的构造,小白对c语言数组的基础总结

/*
时间:2011年9月8日16:21:28
目的:学习构造构造数组的方法,了解动态数组使用上与静态数组一样简单,并体会动态数组的优点
备注:优点包括
      1.动态数组的长度可由程序员输入,不必事先指定
      2.动态数组的内存可由程序员手动分配和释放
      3.动态数组的长度可由程序员手动增长或缩短
      4.动态数组方便进行跨函数使用(这个以后在学)
*/
# include <stdio.h>
# include <malloc.h>

#include <stdio.h>

数组

数组是一系列相同类型元素有序的集合。

数组的定义:

  一般形式为: 类型符 数组名 [常量表达式]如int a[5];
表示数组有五个元素,a[0]-a[5],不存在元素a[5]。

  *注意: 1.常量表达式中可以包含常量和符号常量,如“int a[3+5];”

      2.c语言不允许对数组的大小作动态定义。

  //列如,下列对数组的定义是不合法的:
int n;
scanf("%d",&n);
int a[n];
  //这段代码在Visual c++中编译会报错,但在dev c++ 和 gcc中不会,能够正常运行!

  //但是在被调用的函数中定义的数组,其长度可以是变量或非变量表达式 如:
viod fun
{
  int a[n*2];
  
}

数组的初始化:

  通过查阅书籍,搜索资料,收集到如下初始化方式:

int a[5]={0,1,2,3,4}; 
 // a[0]=0, a[1]=1, a[2]=2, a[3]=3, a[4]=4
char ch[]

int a[5]={0,1}; //只对一部分元素赋值
// a[0]=0, a[1]=1, a[2]=0 a[3]=0 a[4]=0

int a[5]={0}; //全部元素赋值为0;
// a[0]=0, a[1]=0 a[2]=0 a[3]=0 a[4]=0

int a[]={0.1.2.3.4}  //知道元素个数,不指定数组长度
// a[0]=0, a[1]=1, a[2]=2, a[3]=3, a[4]=4

char ch[5]={"hello"};
char ch[5]="hello";

char ch[10]={'h','e','l','l','\0'};
//这里不要忘记为最后的,'\0'分配空间。如果要初始化一个字符串"hello",那为它定义的数组至少有6个数组元素,但是如果忘记了,一些编译器会自动补充

int a[5];
for(i=0;i<5;i++)
{
 a[i]=i;
}//使用for循环赋值

//使用memset给数组赋指定的ASCLL值
  char a[10];
  memset(a,0,strlen; //全部赋值为0
 用法:void *memset(void *s, int ch, int size_t n)

数组的大小和长度:

  sizeof*元素个数

  sizeof

int a[5];
sizeof; //此时a代表的是数组名,而不是数组的首地址 所以大小为20,而不是4;

  malloc函数动态分配数组长度

int main()
{ int len;
printf(“输入分配的数组长度:len=
“);
scanf(“%d,&len”);
int * pArr = (int *)malloc(sizeof(int)*len);
*pArr = 4; //类似于a[0] = 4;
pArr[1] = 10; //类似于a[1] = 10,指针的数组用法
*(pArr+2)=20;    //通过+1操作赋值
   printf(“%d %d %d”, *pArr, pArr[1],*(pArr+2));

free;

return 0;
}

   len=5时,便使用malloc函数分配20个字节,并强制转换成int类型的地址,malloc函数只返回第一个字节地址,通过+1操作获取后面的地址。

   使用free释放内存。数组的地址:    1.a与&a

    虽然a=&a,在值上看起来相等,也都表示数组的首地址,我们通过+1操作来了解它们的区别。

int a[10]={0,1,2,3,4,5,6,7,8,9};  printf("a[0]_size=%d\n",sizeof(a[0])); //数组元素的大小  printf("a_size=%d\n",sizeof;    //数组的大小  printf("a=%p\n",a);  printf("a+1=%p\n",a+1);  printf("&a=%p\n",&a);  printf("&a+1=%p\n",&a+1);return 0;

  图片 1图片 2

  a[0]:数组中的元素,值为0,a[0]+1=1。

  &a[0]:数组首元素的地址,其值与a和&a相同,它的类型为int
*,所以它+1的步长为数组元素大小的字节数,也就是4个字节,&a[0]+1就是a[1]的地址。

数组的使用方式

  1.数组形式

  2.指针形式

int a[5];
a[0]=0;  //数组形式
*=1; //指针形式

修改数组内容的汇编过程:

  1.通过数组名找到首地址;

  2.根据地址的偏移量,找到需要修改元素的地址

  3.修改内容

希望大家多多提点一下。

 

int main (void)
{
    int a[5];    //这是构造静态一维数组,如果int型占4个字节,所以系统自动分配了固定20个字节的内存空间,每4个字节被当做一个int变量来使用

int main(void)

    int len;    //构造动态数组的一个好处是可以由程序员自己手动输入数组的长度,不必事先指定
    int * pArr;
    int i;
    int len2;
    
    printf(“请输入你要存放的元素个数\n”);
    scanf(“%d”,&len);
    pArr = (int *)malloc(sizeof(int)*len);        //动态的构造了一个数组,类似于int
pArr[len],该数组的数组名是pArr,(int*)确定了每个元素都是int型,数组的长度是len,内存空间的长度是len*sizeof(int)
                                                //pArr与静态数组中的a一样,是第一个元素的地址,所以是int*型的
    
    printf(“对动态构造的数组进行赋值\n”);        //对动态数组赋值与对静态数组赋值的方法没有区别
    for (i=0; i<len; ++i)
        scanf(“%d”,&pArr[i]);

{

    printf(“输出动态数组的内容\n”);                //输出的方法也没有区别
    for (i=0; i<len; ++i)
        printf(“%d\n”,pArr[i]);

    int a[5]={1,2,3,4,5};

    printf(“请输入你要修改的元素个数\n”);
    scanf(“%d”,&len2);

    printf(“%#x,
%#x\n”,a,&a[0]);

    pArr = (int
*)realloc(pArr,sizeof(int)*len2);        //构造动态数组的一个好处是可以由程序员自己手动修改数组的长度,可增长也可以缩短,不涉及修改的元素会保留不变

    return 0;

    printf(“输出修改后动态数组的内容\n”);            
    for (i=0; i<len2; ++i)
        printf(“%d\n”,pArr[i]);
    
    free(pArr);            //释放掉动态分配的数组

}

    return 0;
}

验证a和&a[0]是不是同一个值,验证得出a就是a[0]的地址,a是个常量,它的值不能改变

/*
在VC++6.0中的输出结果为:
————————————
请输入你要存放的元素个数
5
对动态构造的数组进行赋值
1 2 3 4 5
输出动态数组的内容
1
2
3
4
5
请输入你要修改的元素个数
4
输出修改后动态数组的内容
1
2
3
4
Press any key to continue
————————————
*/

#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>

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图