标签:
数组可以理解一块有控件的内存地址,和指针相识,但指针是可变,数组是一个常量符号,指定了那块地址。
1>定义一个空间:
1、大小
2、读取方式
int buf[100];//控件是0~99
2> 数组名是一个常量符号,而指针是个变量,一定不要放到=的左边
char buf[100]; buf = "hello world"; //将会报错
3>数组名[m] m 的作用域是在申请的时候,当你后面使用的时候,m可大可小,编译器无法识别判断。所以会出现:
越界
a[10] , a[-10]; 也可以是负,相当于指针的正负,指内存高低方向
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
储存指针的数组,可以理解为二级指针
int *p[5];
一块空间(数据)里面分为5个小控件,控件都指向1个指针地址。
//一维数组 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;
标签:
原文地址:http://my.oschina.net/u/2346786/blog/497053