-《21天学通C语言》 第六版
第8天:数组
声明数组
int array[10];
c语言中数组从0开始,并且c语言编译器不对程序使用的下标是否越界进行判断,程序会顺利编译和链接,但下标越界通常导致错误的结果。
多维数组
#define MONTHS 12
int array[MONTHS];
使用常量定义数组,方便修改,规定常量名大写。
无法使用const定义的常量:
const int MONTHS = 12;
int array[MONTHS] // 错误
数组维数尽可能不要超过三维。
多维数组初始化
#include <stdio.h>
#include <stdlib.h>
int x, y, randarray[5][4];
int main(void)
{
for (x = 0; x < 5; x++)
{
for (y = 0; y < 4; y++)
{
randarray[x][y] = rand();
}
}
for (x = 0; x < 5; x++)
{
for (y = 0; y < 4; y++)
{
printf("\t%d", randarray[x][y]);
}
printf("\n");
}
getchar(); //暂停
return 0;
}
上面程序初始化数组中的元素为随机值并打印,stdlib.h包含随机函数rand()。
最后使用getchar()可以暂停程序,直到用户输入。
没有初始化数组时,如果数组是全局变量则会被设置为0,而局部变量为随机值。
可以使用sizeof()运算符获得数组的大小,也可以使用size()获得大小后除以数组类型对应的元素长度确定包含的元素数。
c语言中数组无法直接相加,但可以写一个函数让它们直接相加。
第9天:指针
指针是一个变量,其值为另一个变量的地址。
指针的声明
typename *ptrname
( * )为间接运算符,表明ptrname是一个指向typename类型变量的指针。编译器根据上下文判断 * 为乘法还是间接运算符。
初始化指针
使用地址运算符初始化指针,pointer = &variable
直接存取,间接存取
printf("%d", rate);
printf("%d", *p_rate)
间接运算符 * 提供存储在指针指向位置的值(称为解除引用)
指针处理多字节变量时,变量的地址为它占用的第一个字节的地址。
指针和数组
不带方括号的数组名是一个常量指针,指向数组第一个元素,即date
&date[0]
,等价。
常量指针无法修改,将其赋值给一个指针即可。
指针递增,递减。pointer++
会自动指向下一个元素,而不是加一个字节。
如果数组类型为int,则pointer+4
,而pointer += 4
则将pointer加16。对指向数组元素的指针递增或递减时,编译器不会跟踪数组开始和结束的位置,因此需要注意指针指向的位置。
可以对两个指针相减,返回两个元素之间相差的元素数,而不是字节差。
ptr1 - ptr2
还可以对指针进行比较,==,<,>,<=,>=,!=等。
无法对指针进行乘除运算。
数组下标法和指针解除引用
下面关系成立:
*(array) == array[0];
*(array + 1) == array[1];
...
*(array + n) == array[n];
将数组传递给函数
函数无法之间接受数组,因此可以通过传递指针和数组的长度给函数,或者在数组最后面加一个标志表示数组结束。
例如:int function(int [], int);
,int function(int *, int);
。
上面两个等价,int [],int *,表示该参数是一个指针,推荐使用第一个形式。
/* 使用指针传递数组给函数 */
#include <stdio.h>
#define MAX 10
int array[MAX], count;
int largest(int [], int);
int main(void)
{
for (count = 0; count < MAX; count++)
{
printf("Enter a integer value: ");
scanf("%d", &array[count]);
}
printf("\n\nthe largest value is : %d", largest(array, MAX));
return 0;
}
int largest(int num_array[], int length)
{
int count,