【自用】整理的C语言笔记(4)

为了方便考试复习,本人仅作搜集和整理部分考试内容,过深不做了解。
原文详见菜鸟教程
1.12C数组
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组中的特定元素可以通过索引访问。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
1.声明数组
在 C 中要声明一个数组,需要指定元素的类型和元素的数量。例如要声明一个类型为 double 的包含 10 个元素的数组 balance,double balance[10];
2.初始化数组
在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。注意这里的数组开头第一个是0.
例如下面声明5个元素double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
单独声明其中一个元素balance[4] = 50.0;
3.访问数组元素
数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。`double salary = balance[9];

注意指针和数组的区别:指针是一个变量,可以进行数值运算。数组名不是变量,不可以进行数值运算。另外字符数组的 首地址可以用 arrgs ,&arrgs,来表示并且它们相等,指针&str和str是不同的,当遇到字符串指针时候要注意处理方式;
1.13C的枚举
可以使代码变得整洁,第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。
1.枚举变量的定义
我们可以通过以下三种方式来定义枚举变量。
先定义类型再定义变量enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; enum DAY day;
同时定义类型和变量enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
省略名称直接定义变量enum { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
通常是不能被遍历的,但在特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。
1.14C的指针
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
举例几个有效的指针
int *ip; /* 一个整型的指针 */ double *dp; /* 一个 double 型的指针 */ float *fp; /* 一个浮点型的指针 */ char *ch; /* 一个字符型的指针 */
一个使用指针的操作例子

#include <stdio.h>
 
int main ()
{
   int  var = 20;   /* 实际变量的声明 */
   int  *ip;        /* 指针变量的声明 */
 
   ip = &var;  /* 在指针变量中存储 var 的地址 */
 
   printf("Address of var variable: %p\n", &var  );
 
   /* 在指针变量中存储的地址 */
   printf("Address stored in ip variable: %p\n", ip );
 
   /* 使用指针访问值 */
   printf("Value of *ip variable: %d\n", *ip );
 
   return 0;
}

在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
1.指针的计算
可以对指针进行四种算术运算:++、–、+、-。
进行递增计算

#include <stdio.h>

const int MAX = 3;

int main ()
{
   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* 指针中的数组地址 */
   ptr = var;
   for ( i = 0; i < MAX; i++)
   {

      printf("存储地址:var[%d] = %x\n", i, ptr );
      printf("存储值:var[%d] = %d\n", i, *ptr );

      /* 移动到下一个位置 */
      ptr++;
   }
   return 0;
}

进行递减计算

#include <stdio.h>

const int MAX = 3;

int main ()
{
   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* 指针中最后一个元素的地址 */
   ptr = &var[MAX-1];
   for ( i = MAX; i > 0; i--)
   {

      printf("存储地址:var[%d] = %x\n", i-1, ptr );
      printf("存储值:var[%d] = %d\n", i-1, *ptr );

      /* 移动到下一个位置 */
      ptr--;
   }
   return 0;
}

2.指针数组和数组指针的区别

指针数组:指针数组可以说成是”指针的数组”,首先这个变量是一个数组。

其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型。

数组指针:数组指针可以说成是”数组的指针”,首先这个变量是一个指针。

其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。

1.15函数指针
函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。
1.调用函数
一个指向max的例子

#include <stdio.h>
 
int max(int x, int y)
{
    return x > y ? x : y;
}
 
int main(void)
{
    /* p 是函数指针 */
    int (* p)(int, int) = & max; // &可以省略
    int a, b, c, d;
 
    printf("请输入三个数字:");
    scanf("%d %d %d", & a, & b, & c);
 
    /* 与直接调用函数等价,d = max(max(a, b), c) */
    d = p(p(a, b), c); 
 
    printf("最大的数字是: %d\n", d);
 
    return 0;
}

2.回调函数
函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。

1.16C的字符串
在 C 语言中,字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
C 中有大量操作字符串的函数,列举一部分。
1 strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
2 strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1);
返回字符串 s1 的长度。
4 strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
5 strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

区别:sizeof 计算的是变量的大小,不受字符 \0 影响;
而 strlen 计算的是字符串的长度,以 \0 作为长度判定依据。
1.17C的结构体
结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
1.定义结构
使用struct语句,struct语句的具体格式
struct tag { member-list member-list member-list ... } variable-list ;
在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。例如

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明。

struct B;    //对结构体B进行不完整声明
 
//结构体A中包含指向结构体B的指针
struct A
{
    struct B *partner;
    //other members;
};
 
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
    struct A *partner;
    //other members;
};

同样你可以对结构体进行初始化

#include <stdio.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};
 

2.访问结构成员
为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。您可以使用 struct 关键字来定义结构类型的变量。相比于C语言,访问结构成员在C#中更加常见。
还可以把结构体作为函数参数
3.把指针指向结构体
定义的方式类似变量指针

struct Books *struct_pointer;

可以在上述定义的指针变量中存储结构变量的地址

struct_pointer = &Book1;

使用指向该结构的指针访问结构的成员

struct_pointer->title;

结构体中成员变量分配的空间是按照成员变量中占用空间最大的来作为分配单位,同样成员变量的存储空间也是不能跨分配单位的,如果当前的空间不足,则会存储到下一个分配单位中。

1.18C的共用体
共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
1.定义共用体
类似结构体的定义,使用union语句,例如:

union Data
{
   int i;
   float f;
   char  str[20];
} data;

同样使用.来访问成员

#include <stdio.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[20];
};
 
int main( )
{
   union Data data;        
 
   data.i = 10;
   data.f = 220.5;
   strcpy( data.str, "C Programming");
 
   printf( "data.i : %d\n", data.i);
   printf( "data.f : %f\n", data.f);
   printf( "data.str : %s\n", data.str);
 
   return 0;
}

结构体与共用体
结构体变量所占内存长度是其中最大字段大小的整数倍,共用体变量所占的内存长度等于最长的成员变量的长度。
另外有两个很长的数据结构,不会同时使用,选共用体可以节省内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值