C语言数组、指针、字符
来源:互联网 发布:犀牛软件模型免费下载 编辑:程序博客网 时间:2024/06/02 19:02
1. 数组元素从0而不是1开始编号,另外,最后一个元素的编号比数组包含的元素小1。例如,在包含10个元素的数组中,元素的编号为0~9。|
有时候,您可能希望包含n个元素的数组中的元素编号好像是1-n。为此最简单的方法是,声明一个数组数目比所需的量多1的数组。您可以将一些相关的数组存储在0好元素中,比如下面这个例子(例子很简单,没有任何实用性,但它演示了如何使用数组):
有时候,您可能希望包含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存储到这个位置可能会覆盖一些重要信息,这可能导致奇怪的程序错误,甚至整个系统崩溃。
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[n]
*array== array[0]
*(array+1)== array[1]
*(array+21)== array[2]
……
*(array+n)== array[n]
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!”;
如:char *message=”Great Caesar/’s Ghost!”;
当上述语句执行时,字符串Great Caesar/’s Ghost!(和一个结尾的空字符)将被存储在内存的某个地方,而指针message将被初始化为指向该字符串的第一个字符,该字符串到底被存储在内存的什么地方是由编译器自动处理的。
前面的声明初始化语句与下面语句等价:
char *message=”Great Caesar/’s Ghost!”;
- C语言数组、指针、字符
- C语言字符指针和字符数组
- C语言内存管理-字符数组与字符指针
- C语言 字符指针和字符数组的区别
- C语言中 字符数组和字符指针分析
- 黑马程序员 C语言的字符数组和字符指针
- C语言内存管理-字符数组与字符指针
- C语言内存管理-字符数组与字符指针
- C语言字符指针和字符数组的区别
- 关于C语言中的字符数组和字符指针
- 关于C语言中的字符指针和字符数组
- c语言中字符数组和字符指针的区别
- 12.5 C语言字符数组和字符指针
- c语言中字符指针与字符数组的区别
- C语言 字符数组与字符指针比较
- c语言的字符数组和字符指针
- C语言提高-28讲: 字符串、字符数组、字符指针
- C语言中关于字符数组和指针数组
- 年终总结
- SQLSERVER无法启动
- 第二层
- 2010年美赛总结
- 想啥说啥
- C语言数组、指针、字符
- C语言结构、共用体、Typedef
- C++面向对象
- 一个简单的非阻塞通讯DEMO。。。
- nio.Buffer小记
- 统计代码行数。。
- 试下动态编译。。
- 结构和联合
- C/C++ 一些细节问题 (1)