您的位置:首页 > 编程语言 > C语言/C++

C语言数组、指针、字符

2010-02-24 20:16 134 查看
 

1.        
数组元素从0而不是1开始编号,另外,最后一个元素的编号比数组包含的元素小1。例如,在包含10个元素的数组中,元素的编号为0~9。|
有时候,您可能希望包含n个元素的数组中的元素编号好像是1-n。为此最简单的方法是,声明一个数组数目比所需的量多1的数组。您可以将一些相关的数组存储在0好元素中,比如下面这个例子(例子很简单,没有任何实用性,但它演示了如何使用数组):

#include <stdio.h>
 
/* Declare an array to hold expenses, and a counter variable */
 
float expenses[13];
int count;
 
int main( void )
{
    /* Input data from keyboard into array */
 
    for (count = 1; count < 13; count++)
    {
        printf("Enter expenses for month %d: ", count);
        scanf("%f", &expenses[count]);
    }
 
    /* Print array contents */
 
    for (count = 1; count < 13; count++)
    {
        printf("Month %d = $%.2f/n", count, expenses[count]);
    }
return 0;

}
“%.2f“是打印包含两位小数的浮点数。
2.        
使用数组时,如果使用的下标超出了数组的声明的界限,程序将能够通过编译,甚至能够运行。然而,结果可能是不可预测的。当这种错误引发问题时,查找起来很困难,因为初始化和访问数组元素时,一定要小心。
3.        
如果名为ptr的指针被初始化为指向变量var,则下面的话是正确的:
*ptr和var指的是var的地址(即存储在var中的值);
ptr和&var指的是var的地址。
4.        
不带方括号的数组名是一个指针,它指向数组的第一个元素。因此,如果您声明了一个名为data[],的数组,则data第一个数组元素的地址。在C语言中,data和&data[0]是等价的。
5.        
指针递增指的是给它加上一个值。例如,当您将指针加1时,指针算术将自动增加指针的值,使之指向下一个数组元素。换句话说,编译器知道指针指向的数据类型(根据指针声明),并将存储在指针中的地址增加该数据类型的长度。指针递减的原理与递增的原理相同,进行运算时,指针算术将根据数组元素的长度做相应的调整。
6.        
编写指针程序时,必须避免一种严重的错误;不要在赋值语句的左边使用未被初始化的指针。例如,下面的语句声明了一个int类型的指针:
   int *ptr;    

该指针未被初始化,因此它不指向任何东西。如果在赋值语句中使用未被初始化的指针,如:*ptr=12;     
则12将被赋给ptr指向的地址。该地址可能是内存的任何地方。将12存储到这个位置可能会覆盖一些重要信息,这可能导致奇怪的程序错误,甚至整个系统崩溃。
7.        
如果声明了名为array[]的数组,则表达式*array指的是第一个数组元素,而*(array+1)数组的第二个元素,以此类推。就整个元素而言,下面的关系成立:
*array== array[0]

*(array+1)== array[1]

*(array+21)== array[2]

……

*(array+n)== array

8.        
如果需要将数组传递给函数,可以声明一个指向该数组的指针,而且该指针是单个数值(数组第一个元素的地址)。如果您将这个值传递给函数,函数将知道数组的地址,从而可以使用指针表示法来存取该数组的元素。两种方法让函数知道数组长度的方法:可以在最后一个元素中存储特殊的值来标识它,函数处理数组时,将在每个元素中查找这样的值,找到这个值之后,便说到达了数组的末尾;另一种更为灵活简单地方法是,将数组长度作为一个参数传递给函数。
字符:
9.        
在计算机内存中,所有的数据都是以数值方式存储的。字符不能直接存储,但每个字符都有对应的数值编码。这种编码就是ASCII码。在这种编码中,每个大小写字母、数字、标点和其它符号都对应于一个0~255的值。如字符a的ASCII码为97,在char变量中存储字符时,实际存储的是97.
10.    
打印数字对应的字符时,一定要使用%c。初始化char变量时,一定要使用单引号,不要使用双引号。不要将扩展ASCII字符存储到有符号字符变量中。
11.    
char变量的最大取值为127,而最大的ASCII码为255。ASCII码通常被分为两部分。标准ASCII码的最大值为127,这包括所有的字母、数字、标点和其它键盘符号。编码128~255是扩展ASCII码,表示的是特殊字符,如外来字符和图形符号。因此,对于标准文本数据,可以使用char变量来存储;如果要打印扩展ASCII字符,则必须使用unsigned
char变量。
12.    
字符串必须以空字符结尾。操纵字符串的函数通过查找空字符来确定字符串的长度。这些函数没有确定字符串末尾的其它方式,如果您遗漏了空字符,程序会认为该字符串一直延续到内存中的下一个空字符。这类错误导致非常令人讨厌的bug。
13.不存储在数组中的字符串:如果不通过分配数组也可以获得内存空存空间,则可以将字符串和空字符存储到那里,并使用一个指向第一个字符的指针来标记字符串的开头,就像字符串被存储在一个数组中一样。如何获得内存空间呢?有两种方法:一是在程序编译时,为字面字符串分配空间;另一种方法是在程序执行时,使用malloc()来分配空间,准备称为动态分配。
如:char *message=”Great Caesar/’s Ghost!”;
当上述语句执行时,字符串Great Caesar/’s Ghost!(和一个结尾的空字符)将被存储在内存的某个地方,而指针message将被初始化为指向该字符串的第一个字符,该字符串到底被存储在内存的什么地方是由编译器自动处理的。
前面的声明初始化语句与下面语句等价:

char *message=”Great Caesar/’s Ghost!”;
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息