Home » 未分类 » Linux C 学习笔记 十

Linux C 学习笔记 十

递归

递归与循环的异同

都能用来完成一个反复的过程。

循环:每次反复都执行同一个过程。更适合运算结果/

递归:每次反复都以上一层结果作为依托。更适合描述算法。

栈空间开销大。

 

结构体和联合

. 表示用结构提变量访问。

-> 表示用结构体指针访问

 

结构体进行函数调用时,建议使用传值调用。输出可以使用传值,但是输入必须传地址。

 

成员本身又属于一个结构体则需要使用若干成员运算符,一级一级地找到最低一级的成员。

结构体变量成员可以像普通变量一样进行各种相应的运算。

可以引用结构体变量成员的地址,也可以引用结构体变量的地址。

 

 

可以将一个结构体放入另外一个结构体,”但结构体不能嵌套它自身,指针例外”

 

 

struct student stu3;//结构体之间赋值,逐项复制。

//若结构体内带有指针类型,不推荐

//会导致2个结构体变量内的指针指向同一个内存地址

print_StuInfo(stu);

stu3 = stu;//结构体间逐项赋值

 

让一个指针指向结构体,则其指向的是结构体的第一个成员的地址,也是结构体的地址。

 

结构体的三种引用形式

结构体变量名.成员名

(*p.成员名

p->成员名

 

结构体的存储分配

struct align1

{

char a;//4

itn b;//4

char c;//4

}

//12字节

 

struct align2

{

int b;//4

char a;

char c;

//和起来占4

}

 

原因因为:内存地址字对齐,CPU一次读取固定长度

 

位段:

与结构类似,每个成员是一个或多个位的字段

所有成员实际存储于一个或多个整形变量中。

说明:

位段成员必须声明为int,signed int,unsigned int

每个成员名后面是冒号和长度(位长)

位段的移植能力较弱

在位段中先声明为低位,后声明为高位。

 

#include<stdio.h>

 

struct CHAR

{

unsigned a:8;

unsigned b:12;

unsigned c:12;;

};

int main(void)

{

unsigned int i;

 

struct CHAR *p=(struct CHAR*)&i;

p->a = 0b11111111;

p->b = 0;

p->c = 0b111111111111;

 

printf(“i:%x\n”,i);

return 0;

}

 

 

 

联合

所有成员引用的是内存中相同的位置

联合的长度是它最长成员的长度

联合变量初始化必须是联合的地一个成员类型。

联合体在使用时,同一时刻只能作为其成员的某一个类型来处理。因为在其内部所有成员共享同一段内存空间。

 

数据存放从地位开始按字节顺序存放。

 

#include <stdio.h>
#include <stdlib.h>

typedef unsigned int uint32;

/*
* gcc -std=c99 -o bin/net1 src/net1.c
*/
int main(void)
{
uint32 ipAddr[4];
uint32 maskAddr[4];
uint32 netAddr[4];
uint32 ip32 = 0;
uint32 mask32 = 0;
uint32 net32 = 0;
int prefix;

printf(“Enter IP address <x.y.z.t>: “);
scanf(“%d.%d.%d.%d”,
&ipAddr[3],&ipAddr[2],&ipAddr[1],&ipAddr[0]);

printf(“Enter prefix: “);
scanf(“%d”,&prefix);

// 192.168.1.200
//将IP地址转换为32位计算机地址
//
//0000,0000 0000,0000 0000,0000 0000,0000
//0000,0000 0000,0000 0000,0000 200
//0000,0000 0000,0000 1 0000,0000
//0000,0000 0000,0000 1 200
//0000,0000 0000,0000 0000,0000 168
//
//000000000000000000000000 192
//0000000000 192 168
//0000000 192 168 0000,0000
//
//192 168 1 0000,0000
for(int i = 3; i >= 0; i–)
ip32 = ip32 << 8 | ipAddr[i];
// 24
//创建32位mask
//24
//111100000000000000000000000000000
//11111111111111110000,0000
//111111111111111111111111111111111
//0001 0000000000000000000000000000 28
//0010 0000000000000000000000000000 29
//0100 0000000000000000000000000000 30
//1000 0000000000000000000000000000 31
for(int i = 32 – prefix; i < 32; i++)
mask32 = mask32 | (1 << i);

//AND获取32位网络地址
net32 = ip32 & mask32;

//192.168.45.111
//将32位mask转换为 x.y.z.t
for(int i = 0; i < 4; i++){
maskAddr[i] = mask32 & 0b11111111;
mask32 = mask32 >> 8;
}

//将32位IP地址转换为 x.y.z.t
for(int i = 0; i < 4; i++){
netAddr[i] = net32 % 256;
net32 = net32 / 256;
}

//1234 –> % 10 4
// 1234 / 10 –> 123

printf(“\nAddress:\n”);
printf(“IP Address:\t%d.%d.%d.%d\n”,
ipAddr[3],ipAddr[2],ipAddr[1],ipAddr[0]);
printf(“Mask Address:\t%d.%d.%d.%d\n”,
maskAddr[3],maskAddr[2],maskAddr[1],maskAddr[0]);
printf(“Net Address:\t%d.%d.%d.%d\n”,
netAddr[3],netAddr[2],netAddr[1],netAddr[0]);

return 0;
}

This entry was posted in 未分类. Bookmark the permalink.