20171213数组指针

来源:互联网 发布:nba湖人英格拉姆数据 编辑:程序博客网 时间:2024/06/03 20:11

数组



在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。

数组是具有相同类型的一组数据。当访问数组中的数据时,可以通过下标来指明。数组元素可以为任何数据类型,数组下标从0开始,即第一个元素对应的下标为0,以后逐个递增。数组可以一维也可多维。


1.数组说明的一般形式


 类型说明符  数组名 [常量表达式],……; 其中,类型说明符是任一种基本数据类型或构造数据类型。 数组名是用户定义的数组标识符。  方括号中的常量表达式表示数据元素的个数,也称为数组的长度。


例如:

int a[10]; 说明整型数组a,有10个元素。


float  b[10],c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素。


char ch[20]; 说明字符数组ch,有20个元素。


2. 数组的初始化



(1)我们可以在定义一个数组的同时对它进行初始化操作,例如:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};


(2)我们也可以只对数组的部分元素进行初始化操作,例如:
int a[10] = {1, 2, 3, 4, 5};
这里我们只对数组的前5个元素做了初始化操作


(3)如果我们对数组的所有元素都进行了初始化操作,那么我们甚至可以省略数组长度不写,编译器可以根据初始化数组元素的个数自动计算出数组的长度。

int a[] = {11, 7, 6};



3.数组元素的表示方法


在C语言中只能逐个地使用下标变量, 而不能一次引用整个数组。

 

例如,输出有10 个元素的数组必须使用循环语句逐个输出各下标变量:

for(i=0; i<10; i++) 
 printf("%d",a[i]);


而不能用一个语句输出整个数组,下面的写法是错误的
 printf("%d",a);


4.数组在内存中的存放


数组就是在内存中开辟一块连续的、大小相同的空间,用来存储数据。数组名代表它的首地址。

((int)a+1)是指a地址再加一个字节,直接地址值相加而不是指针  而(a+1)是指指针偏移一个步长(步长等于sizeof(指针指向的元素类型))即4个字节,指向数组第二个元素的地址。  所以(int*)((int)a+1)是第一个数组元素加一个字节。 而数组元素的存放是序号大的元素排在高地址,序号小的排在低地址,而每个元素按高字节放高地址,低字节放低地址


5.字符数组


用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。

他的定义、初始化和引用与其他数组一样

值得注意的是字符数组与字符串的关系(字符数组是一个存储字符的数组,而字符串是一个用双括号括起来的以'\0'结束的字符序列,虽然字符串是存储在字符数组中的,但是一定要注意字符串的结束标志是'\0'。)


(1).字符串结束的标志

我们一般都是需要使用'\0'来表示字符串的而结尾,并且没有影响到相应的数组的操作的其他的内容,而是在系统外部自动添加的。这就是操作系统的问题,所以我们是可以使用'\0'来判断字符串的结束。


(2).字符串中的常量

在对其初始化时的两种方式

1.方式1)char c[]={'I',' ',a','m',' ',h','a','p','p','y','\0'};//就是逐个对应赋值

2.char c[]={"I am happy"};

方式1的字符串的长度是11,方式2的字符串的长度是10

所以:若是,char c[10] = {"china"};
前五个是元素,第六个是'\0',后面的4个也设定了空字符。


总结:字符串并不要求最后一个字符为'\0',甚至可以不包含'\0'。是否需要'\0',系统会自动增加。



(3).字符数组输出

1、逐个字符输入输出,格式符是"%c",循环输出。

2、将整个字符串一起输出。格式符是"%s",表示输出的是字符串
eg:char c[] = {"china"};
prinft("%s",c);
输出时,遇到'%c'就停止输出。输出结果是china


注意:(1)."%s" 在函数中的输出项是字符数组名。

(2).若是数组的长度大于字符串的实际长度,还是遇到'\0'就停止输出。
char c[10]={"china"}; 同样是输出:china 而不是输出10个字符

(3).如果数组中有大于1个'\0'的符号的,遇到第一个'\0'的时候就会停止输出。


6.指针与数组的关系


举一个例子:

int a[10];
int *const p=a

sizeof(a); // 40
sizeof(p); // 8


数组的地址和数组首元素的地址虽然值相同,但意义不同。

值相同是因为,一个变量无论在在内存中占据多大空间,它的地址总是该空间第一个内存单元的地址。而数组的元素依次连续分布在整块数组空间中,数组空间的第一个内存单元被数组首元素占据,必然也同时是数组首元素所占空间的第一块空间单元,所以数组的地址与数组首元素的地址相同。

意义不同是因为,数组地址代表了整块数组所占据的内存空间,而数组首元素的地址只代表了首元素所占据的空间。

&a 表示取数组的地址,其结果是一个指向该数组的指针,它可以赋值给另一个同类型的指针。

&a[0]表示取数组首元素的地址,其结果是指向该数组首元素的指针,可以赋值给另一个同类型的指针。
注意:指向数组的指针和指向数组首元素的指针是两种不同类型的指针。




原创粉丝点击