C语言期末复习

内容源自各类博客及百度。知识点比较散。

在C语言中使用数组必须先进行定义。一维数组的定义方式为:
    类型说明符 数组名 [常量表达式];
方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
常量表达式:就是表达式里面只有常量值。比如 10+5+3/1.0,"abcd" 就是常量表达式。a+10/7就不是常量表达式。
 如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:
int a[5]={1,2,3,4,5};
可写为:
int a[]={1,2,3,4,5};
字符数组:
由" "包围的字符串会自动在末尾添加'\0'。例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言会在最后隐式地添加一个'\0',这个过程是在后台默默地进行的,所以我们感受不到。
下图演示了"C program"在内存中的存储情形:
C program\0
需要注意的是,逐个字符地给数组赋值并不会自动添加'\0',例如:
char str[] = {'a', 'b', 'c'};
数组 str 的长度为 3,而不是 4,因为最后没有'\0'。
当用字符数组存储字符串时,要特别注意'\0',要为'\0'留个位置;这意味着,字符数组的长度至少要比字符串的长度大 1。请看下面的例子:
char str[7] = "abc123";
"abc123"看起来只包含了 6 个字符,我们却将 str 的长度定义为 7,就是为了能够容纳最后的'\0'。如果将 str 的长度定义为 6,它就无法容纳'\0'了。
字符串"abcd"长度为4,是因为字符串长度指的是字符串中有效字符的个数,不包含C风格结束符\0,
而字符串数组a[]="abcd"长度为5,因为这个是算的数组的长度,也就是所占用的存储空间,当然要包含\0结束符(它也要占用存储空间)。
a[10]="abcd"的长度为10,因为显示指定了字符数组的长度,所占内存当然就是10,它的存储空间是连续的,
也就是说,10个字符空间中,前面分别是a,b,c,d和结束符\0,后面全部都是0(被初始化了),总共有5个0,加上前面的abcd和结束符\0,一共10个,他们的存储是连续的。
a[]={'a','b','c','d'},没有按照双引号定义,因此不算C风格字符串,只是一个字符数组。而又没有指名大小,那么它的大小等于初始化的长度,这里就是4,sizeof也等于4,没有结束符\0了。
由" "包围的字符串会自动在末尾添加’\0’
逐个字符地给数组赋值并不会自动添加’\0’
在函数内部定义的变量、数组、结构体、共用体等都称为局部数据。在很多编译器下,局部数据的初始值都是随机的、无意义的,而不是我们通常认为的“零”值。
char str[30] = {0};  //将所有元素都初始化为 0,或者说 '\0'
如果只初始化部分数组元素,那么剩余的数组元素也会自动初始化为“零”值,所以我们只需要将 str 的第 0 个元素赋值为 0,剩下的元素就都是 0 了。
函数可以嵌套调用,但是不可以嵌套定义。
外部函数:定义函数时默认省略extern,可供其他文件调用。
C语言是值传递,即便是指针作为参数。
strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。
关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等
char* s = "0123456789";
sizeof(s);     //结果 4    ===》s是指向字符串常量的字符指针
sizeof(*s);    //结果 1    ===》*s是第一个字符
strlen(s);     //结果 10   ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
strlen(*s);     //结果 10   ===》错误

char s[] = "0123456789";
sizeof(s);     //结果 11   ===》s是数组,计算到\0位置,因此是10+1
strlen(s);     //结果 10   ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
sizeof(*s);    //结果 1    ===》*s是第一个字符
char s[100] = "0123456789";
sizeof(s);     //结果是100 ===》s表示在内存中的大小 100×1
strlen(s);     //结果是10  ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
int s[100] = "0123456789";
sizeof(s);     //结果 400  ===》s表示再内存中的大小 100×4
strlen(s);     //错误      ===》strlen的参数只能是char* 且必须是以‘\0‘结尾的
char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);\\结果是 4 3 3 2
char p[] = {'a','b','c','d','e','f','g','h'};
char q[] = {'a','b','c','d,'\0','e','f','g'};
sizeof(p);     //结果是8 ===》p表示在内存中的大小 8×1
strlen(p);     //为一个随机值,结果与编译器有关,不同编译器结果一般不同
sizeof(q);     //结果是8 ===》p表示在内存中的大小 8×1
strlen(q);     //结果为4 ===》存在'\0',遇到'\0'计算停止。
---------------------
原文:https://blog.csdn.net/magic_world_wow/article/details/80500473
struct {
  
   char a;   
   int b;
   char c;
   double d;
   }e
为什么sizeof(e)的大小是24呢
(内存对齐)
字节对齐的细节和编译器实现相关:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍;
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍
对于 b 它的首地址应该被 4 整除,所以 a 后面应该填充 3 个字节,而 d 为了使自己的首地址可以被 8 整除,那么它前面的 c 应该填充7个字节;
因此: a 占 4, b 占 4,c 占 8, d 本身 8 总共:24
str函数系列:https://blog.csdn.net/We_are_family678/article/details/79671956
类型相同的两个指针变量不能进行加法运算,但能进行减法运算。

猜你喜欢

转载自www.cnblogs.com/960571726y/p/11116870.html