《21天学通C语言》总结(2)

-《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,
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值