位、字节、字
位,最小的存储单位,可以存储0或者1
字节,常用的计算机存储单位,一个字节等于8位(我是你8,哈哈)
字,设计计算机时给定的自然存储单位,对于8位的微型计算机(如,最初的苹果机),一个字长只有8位。从那以后,个人计算机字长增至16位、32位,直到目前的64位。
(自我认识:字和字节都是相对位来计量的,我经常拿字节和字比较,有点傻)
函数
分析程序:程序在三处使用了starbar标识符
函数原型:告诉编译器函数starbar()的类型
void starbar(void);
第1个void是函数类型,void类型表明函数没有返回值。
第2个void(在圆括号中)表明该函数不带参数。
分号表明这是在声明函数,不是定义函数。
一般而言,函数原型指明了函数的返回值类型和函数接受的参数类型。这些信息称为该函数的签名。
函数调用:表明在此处执行函数
starbar();
函数定义:明确地指出定义了函数要做什么
void starbar(void);
{
...
}
当计算机执行到starbar();语句时,会找到该函数的定义并执行其中的内容。
指针
什么是指针?从根本上看,指针是一个值为内存地址的变量(或者数据对象)
正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。
(指针是变量,变量,变量,重要的事情说三遍 !!!)
假设一个指针变量名是ptr,可以编写如下语句:
ptr = &pooh ; // 把pooh的地址赋给ptr
对于这条语句,我们说ptr“指向”pooh。
ptr和&pooh区别是ptr是变量,而&pooh是常量。
或者,ptr是可以修改的左值,而&pooh是右值。
还可以把ptr指向别处:
ptr = &bah ; // 把ptr指向bath,而不是pooh
现在ptr的值是bah的地址
要创建指针变量,先要声明指针变量的类型。
假设想把ptr声明为储存int类型变量地址的指针,就要使用下面介绍的新运算符。
间接运算符 *
使用间接运算符 * 找出存储在bah中的值,该运算符有时也称为解引用运算符。
nurse = 22;
ptr = &nurse; //指向nurse的指针
val = *ptr; //把ptr指向的地址上的值赋给val
执行以上3条语句的最终结果是把22赋给val。
声明指针
int * pi; //pi是指向int类型变量的指针
char * pc; //pc是指向char类型变量的指针
float * pf , * pg; //pf、pg都是指向float类型变量的指针
类型说明符表明了指针所指向对象的类型,星号(*)表明声明的变量是一个指针。
声明的意思是pi是一个指针,*pi是int类型
结构体
结构体的定义:
为了定义结构,必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct tag {
member-list
member-list
member-list
...
} variable-list ;
tag 是结构体标签。
member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
variable-list 结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。
下面是声明 Book 结构的方式:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。以下为实例:
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct
{
int a;
char b;
double c;
} s1;
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct SIMPLE
{
int a;
char b;
double c;
};
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef struct
{
int a;
char b;
double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的。结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。
结构体变量的初始化:
和其它类型变量一样,对结构体变量可以在定义时指定初始值。
#include <stdio.h>
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};
int main()
{
printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
}
输出结果为
title : C 语言
author: RUNOOB
subject: 编程语言
book_id: 123456