例87:结构体的使用
#include <stdio.h> // 定义结构 struct Shape { int type; int color; float radius; float area; float perimeter; }; /** * 给结构体变量赋值 * @Author dust_fall * @param shape 要改变结构体变量的指针 */ void change_structure(struct Shape *shape) { (*shape).type = 0; (*shape).color = 1; (*shape).radius = 5.0; (*shape).area = 22.0 / 7.0 * (*shape).radius * (*shape).radius; (*shape).perimeter = 2.0 * 22.0 / 7.0 * (*shape).radius; } int main(int argc, char const *argv[]) { struct Shape circle; change_structure(&circle); printf("circle.type %d\n", circle.type); printf("circle.color %d\n", circle.color); printf("circle.radius %f circle.area %f circle.perimeter %f\n", circle.radius, circle.area, circle.perimeter); return 0; }例88:结构体的另一种使用(看看和上面的区别)
#include <stdio.h> struct Shape { int type; int color; float radius; float area; float perimeter; }; void change_structure(struct Shape *shape) { shape->type = 0; shape->color = 1; shape->radius = 5.0; shape->area = 22.0 / 7.0 * shape->radius * shape->radius; shape->perimeter = 2.0 * 22.0 / 7.0 * shape->radius; } int main(int argc, char const *argv[]) { struct Shape circle; change_structure(&circle); printf("circle.type %d\n", circle.type); printf("circle.color %d\n", circle.color); printf("circle.radius %f circle.area %f circle.perimeter %f\n", circle.radius, circle.area, circle.perimeter); return 0; }例89:一段古老的代码
#include <stdio.h> // 据说这里的dos.h在非纯16位dos系统下无法调用, 博主试过gcc、vc、vs都无法通过编译 // 错误是“curr_date”使用未定义的 struct“main::date” #include <dos.h> int main(int argc, char const *argv[]) { struct date curr_date; getdate(&curr_date); printf("Current date: %d-%d-%d\n", curr_date.da_mon, curr_date.da_day, curr_date.da_year); return 0; }例90:又一段古老的代码
#include <stdio.h> #include <dos.h> int main(int argc, char const *argv[]) { union REGS inregs, outregs; inregs.h.ah = 0x30; inregs.h.al = 0; intdos(&inregs, &outregs); printf("Current version %d.%d\n", outregs.h.al, outregs.h.ah); return 0; }例91:还一段古老的代码
#include <stdio.h> #include <dos.h> void main(void) { union REGS inregs, outregs; inregs.x.ax = 0x3000; intdos(&inregs, &outregs); printf("Current version %d.%d\n", outregs.x.ax & 0xFF, outregs.x.ax >> 8); }例92:似乎又一段…(Dos下near指针,far指针,huge指针)
#include <stdio.h> #include <malloc.h> int main(int argc, char const *argv[]) { int i; float huge *values; if ((values = (float huge *) halloc (17000, sizeof(float))) == NULL) printf ("Error allocating huge array\n"); else { printf("Filling the array\n"); for (i = 0; i < 17000; i++) values[i] = i * 1.0; for (i = 0; i < 17000; i++) printf ("%8.1f ", values[i]); hfree(values); } return 0; }例93:在main中定义结构体
#include <stdio.h> int main(int argc, char const *argv[]) { // 定义结构并初始化变量 struct Shape { int type; int color; float radius; float area; float perimeter; } circle = {0, 1, 5.0, 78.37, 31.42}; printf("circle.type %d\n", circle.type); // circle.type 0 printf("circle.color %d\n", circle.color); // circle.color 1 printf("circle.radius %f circle.area %f circle.perimeter %f\n", circle.radius, circle.area, circle.perimeter); // circle.radius 5.000000 circle.area 78.370003 circle.perimeter 31.420000 return 0; }例94:使用指针修改变量
#include <stdio.h> int main(int argc, char const *argv[]) { int counter = 10; // 定义指针变量 int *iptr; // 指针指向counter变量 iptr = &counter; printf("Addres in iptr %x Value at *iptr %d\n", iptr, *iptr); // Addres in iptr 61ff18 Value at *iptr 10 // 通过指针修改变量 *iptr = 25; printf("Value of counter %d\n", counter); //Value of counter 25 return 0; }例95:使用指针遍历数组
#include <stdio.h> int main(int argc, char const *argv[]) { int values[5] = {1, 2, 3, 4, 5}; int counter; int *iptr; // 指向数组首元素(数组名就是数组的首地址) iptr = values; for (counter = 0; counter < 5; counter++) { printf("%d\n", *iptr); // 指针++来指向下一个元素 iptr++; } return 0; }例96:不使用printf来打印字符串
#include <stdio.h> void show_string(char *string) { while (*string) // putchar函数打印单个字符 putchar(*string++); } int main(int argc, char const *argv[]) { show_string("Jamsa's 1001 C/C++ Tips"); return 0; }例97:结构体字符串的访问
#include <stdio.h> int main(int argc, char const *argv[]) { struct Date { char month_name[64]; int month; int day; int year; } current_date = { "July", 7, 4, 1994 }; int i; // 当结构体变量的month_name字符串到'\0'时结束循环 for (i = 0; current_date.month_name[i]; i++) putchar(current_date.month_name[i]); return 0; }例98:结构体变量做实参传入函数
#include <stdio.h> struct Shape { int type; int color; float radius; float area; float perimeter; }; void show_structure(struct Shape shape) { printf("shape.type %d\n", shape.type); printf("shape.color %d\n", shape.color); printf("shape.radius %f shape.area %f shape.perimeter %f\n", shape.radius, shape.area, shape.perimeter); } int main(int argc, char const *argv[]) { struct Shape circle; circle.type = 0; circle.color = 1; circle.radius = 5.0; circle.area = 22.0 / 7.0 * circle.radius * circle.radius; circle.perimeter = 2.0 * 22.0 / 7.0 * circle.radius; show_structure(circle); return 0; }例99:关于共用体(联合体)的内存大小问题
#include <stdio.h> /** * 共用体(联合体)的共用内存等于最大属性的字节数 * (如果共用体内部包含结构体还需考虑内存对齐) */ int main(int argc, char const *argv[]) { union EmployeeDates { int days_worked; struct Date { int month; int day; int year; } last_day; } emp_info; union Numbers { int a; float b; long c; double d; } value; printf("Size of EmployeeDates %d bytes\n", sizeof(emp_info));// Size of EmployeeDates 12 bytes printf("Size of Numbers %d bytes\n", sizeof(value)); // Size of Numbers 8 bytes // 关于内存对齐的计算, 这里不多做介绍, 可以自己百度(其实不复杂, 但要用文字组织就多了), 实在不明白的可以私信博主 return 0; }