【黑马程序员】C语言学习笔记之错题集

来源:互联网 发布:天天特价淘宝网衣服 编辑:程序博客网 时间:2024/06/06 02:21

--------------------------------------------IOS期待与您交流!--------------------------------------------

一、数组赋值

对于数组的赋值有多种方式:
int a[] = {1, 2, 3};
int b[3] = {1, 2, 4};

int c[4] = {2, 6};// {2, 6, 0, 0}
int d[5] = {[1] = 4, [3] = 9}; // {0, 1, 0, 9, 0}
以上两种情况都会默认把没有赋值的元素赋值为0

而对以下情况就会随机赋值给未赋值的元素
元素个数是常量时:
int e[10];
e[0] = 3;
e[8] = 4;
元素个数是变量时:
int f = 8;
int g[f];
g[2] = 8;
b[6] = 9;

注意:元素个数是变量时不能这么赋值,编译器会报错:
int f = 8;
int g[f] = {0, 0, 8, 0, 0, 0, 9, 0, 0, 0};

总结:
* 数组在定义的同时并初始化的时候,会给未赋值的元素赋默认值
* 数组先定义后初始化时,不会给未赋值的元素赋默认值,而是随机的赋值

二、字符串输出结束问题

#include <stdio.h>int main(){    char c1[] = {'a', 'b'};    char c2[] = {'c', 'd'};    char c3[] = {'e', 'f', '\0'};        printf("%s\n", c1);    printf("%s\n", c2);    printf("%s\n", c3);    return 0;}
输出:

ab

cdab

fe

在内存中得表示如下:

分析:在给变量分配地址时,优先分配高地址给变量,先定义先分配。
输出c1时:会从c1所在的地址ffc8开始依次输出字符a、b,没有遇到\0,但是到了代码块的边界,结果输出:ab
输出c2时:会从c2所在的地址ffc6开始依次输出c、d,但是没有遇到\0,所以继续输出a、b,直到遇到代码块边界,结果输出:cdab
输出c3时:从c3所在地址ffc3开始依次输出e、f,直到遇到\0,输出结束,结果输出:ef
由分析推出:
* 在printf中%s输出字符串时,要么在遇到\0时结束,要么在遇到代码块边界结束。




待续......

--------------------------------------------IOS期待与您交流!--------------------------------------------

详细请查看:http://edu.csdn.net

0 0
原创粉丝点击