码迷,mamicode.com
首页 > 编程语言 > 详细

C语言内存空间的使用--数组

时间:2015-08-25 21:55:35      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:

1,数组的定义

数组可以理解一块有控件的内存地址,和指针相识,但指针是可变,数组是一个常量符号,指定了那块地址。

1>定义一个空间:

    1、大小

    2、读取方式

int buf[100];//控件是0~99

2> 数组名是一个常量符号,而指针是个变量,一定不要放到=的左边

    char buf[100];
    buf = "hello world";   //将会报错

3>数组名[m]  m 的作用域是在申请的时候,当你后面使用的时候,m可大可小,编译器无法识别判断。所以会出现:   

    越界  

  a[10]  ,  a[-10];  也可以是负,相当于指针的正负,指内存高低方向


2,数组控件的初始化

1> char buf[10] = {‘a‘,‘b‘,‘c‘};     buf当成普通内存来看,没有问题 。

但是若buf当成一个字符串来看,最后加上一个‘\0‘ 

//
经典错误一:
char buf[10] = {"abc"};   //默认最后加上一个‘\0‘ 
char buf[10] = "abc";     //也可以省略{}   
char *p = "abc"; 
   buf[2] = ‘e‘;  --> abe
   p[2] = ‘e‘;     报错
/*
char buf[10] = "abc"; 这个等式意思是将“abc”这个字符串常量一个一个地拷贝到buf[10]这个变量中。
char *p = "abc";   而这个意思是将指针*p变量的内存空间指向“abc”这个字符串常量
 buf[2] = ‘e‘;     因为buf空间是变量,所以可以更改
 p[2] = ‘e‘;       而指针p空间是指向常量,所以不可以更改
*/

经典错误二:
char buf[] = "abcd";     //5   编译器自定义空间值 
char buf[10] = "abc"; 
buf = "hello world"      //一般我们想要通过这样再次赋值,但这样相当于更改空间的标识,标识是不可改的
   第二次内存初始化,赋值方法: 
1>逐一处理 :buf[0] = ‘h‘   buf[1] = ‘e‘ ... buf[n] = ‘d‘, buf[n+1] = 0;

2,非字符控件

当我们看到char buf[];的时候就可以理解这个是个字符串string,而unsinged char buf[];则可以理解为数据data

字符串拷贝

   char buf1[] = "hello world";
   char buf2[] = "ABCDEFG";
   printf("%s",memcpy(buf1,buf2,2));

数据拷贝

    unsigned int buf1[] = {-1,-2,1,2};
    unsigned  int buf2[] = {-3,-4};
    printf("%d",memcpy(buf1, buf2, 2*sizeof(int))); //必须要声明unsigned


3,数组指针

储存指针的数组,可以理解为二级指针

int *p[5];

一块空间(数据)里面分为5个小控件,控件都指向1个指针地址。

技术分享


4,二维数组指针

    //一维数组
    int a[6];
    //指针指向数组a
    int *p1 = a;
    
    //指针指向二维数组b的第六列,因为指针是指向行的,所以列要特别说明
    int b[5][6];
   // int (*p)[6] = b;    如果写成int *p[6]; 就变成了指针数组

多维数组指针

int b[2][3][4];

int (*p)][3][4] = b;




























C语言内存空间的使用--数组

标签:

原文地址:http://my.oschina.net/u/2346786/blog/497053

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!