1.関数ポインタ(関数ポインタ):
関数ポインタ変数は、関数へのポインタです。
通常、我々は、ポインタ変数は、整数、文字、または配列を指すような変数であると言うと、関数ポインタは関数へのポインタです。
関数ポインタは、パラメータを渡し、関数を呼び出すための関数としての一般的なようです。
関数ポインタ変数の宣言:
typedef int型(* fun_ptr)(int型、int型);
例:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html
サブ:私の前回の記事で説明したように、ポインタ機能は、関数へのポインタを返します。
2.コールバック(コールバック関数):
、コールバック関数は、関数のパラメータとして使用することができる関数ポインタ関数ポインタ変数を介して関数呼び出しがあります。
"
以下は、多くの場合、ほとんどクリーク陵を知っている著者からのコメントです。
あなたは、あなたがそこに店員にお使いの携帯電話を残したので、数日店の株式の後、店員がお使いの携帯電話をヒット、何か、あなたが商品をしたくないだけで何かを買いに店に行くあなたが電話を受けストア後、商品をピックアップします。この例では、あなたの番号は、コールバック関数と呼ばれ、あなたが電話店員が呼び出されるコールバック関数を登録するには残っている、後の株式トリガーイベントに関連するコールバックと呼ばれる店、あなたは関数が呼び出されるコールバックを呼び出すために店員を呼び出し、あなたは、応答と呼ばれるコールバックイベントを拾うために店に行きます。
"
簡単に言えば手段は:あなたはパラメータの機能は、今、あなたはBの機能を参照するために、引数でBの関数ポインタを行うので、あなたは、Bの機能を知らない定義が含まれています。引用されたBの関数が定義されたら、実行時にAの機能を使用することができます。
例:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html
サブ:size_tの符号なし整数と同様のデータ型であるが、容量がintと符号なしの範囲よりも一般に大きいです。大きな配列があってもよい記憶する容量十分に大きなを有することARRAYSIZE size_tの変数を確保するために、本明細書中で使用されます。
3.文字列(文字列):
C言語では、文字列の実際に使用して ヌル 文字を「\ 0」文字の1次元配列が終了しました。したがって、文字列が含まれている、NULLで終わる文字列。
次の文は作成して「こんにちは」の文字列を初期化します。店舗null文字の配列の末尾ので、単語の文字数よりも文字の配列のように、複数のサイズの「Hello」です。
チャー挨拶[6] = { ' H'、 'E'、 'L'、 'L'、 'O'、 '\ 0'};( 普通の人はこれを使用しない)(なしの ヌル 文字バック自動的に定数配列.Cコンパイラの初期化の際に、文字列の最後、「\ 0」文字列の最後に。)
挨拶のchar [] =「こんにちは」;(。より一般的な、そして注目のような他の言語「[]」、Cの文字列は、アレイ内にあるため)
共通操作:
strcpyの(S1、S2);文字列S2 S1に文字列をコピーします。
strcatは(S1、S2)、接続文字列s2。
STRLENは(S1)、S1の文字列の長さを返します。
strcmp(S1、S2)、S1、S2が同じである場合、0を返す、S1 <S2は、0が返され未満である場合に、S1> S2の場合は0が返されるよりも大きいです。
strchrは(S1、CH);第CHを発生する第1の文字列s1の位置へのポインタを返します。
STRSTR(S1、S2)、文字列の最初の出現のストリングS1、S2の位置を指すポインタを返します。
サブ:
sizeof strlenをとの違い:
strlen 是函数,sizeof 是运算操作符,二者得到的结果类型为 size_t,即 unsigned int 类型。
sizeof 计算的是变量的大小,不受字符 \0 影响;
而 strlen 计算的是字符串的长度,以 \0 作为长度判定依据。
4.结构体(struct):
a.定义:
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
假设我们有一个电子图书馆,我们可以用结构体来定义一本书及其属性: 1.标题 2.作者。。。之类。
为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
}book;
在一般情况下,tag 、member-list、variable-list 这 3 部分(对应代码里面的Books, char title[50]; , book)至少要出现 2 个。
sub :
1.不同的定义方式产生的结构体可以被视为不同的类型,无法相等(不管成员是不是一样).
2.结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。
3.可以在定义的时候初始化,跟变量一样。
详见:https://www.runoob.com/cprogramming/c-structures.html
b. 结构访问还有使用:
为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。您可以使用 struct 关键字来定义结构类型的变量。
比如 你要访问 Book1 的title --- Book1.title (如果学过面对对象编程的朋友估计感觉很眼熟)
c.结构作为函数参数:
您可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。您可以使用上面实例中的方式来访问结构变量:
void printBook( struct Books book ){
。。。
。。。
。。。
}
d.指向结构的指针:
struct Books *struct_pointer; 定义
struct_pointer = &Book1; 结构变量的地址
struct_pointer->title; 指向该结构的指针访问结构的成员
e.位域:
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。
所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
位域和结构体的定义基本上差不多,只不过需要多加 位域长度 。
struct bs{
int a:8;
int b:2;
int c:6;
}data;
说明 data 为 bs 变量,共占两个字节。其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 6 位。
使用时这两种都可以:1. data.a 2. data->a
sub:
1.一个位域存储在同一个字节中,如一个字节所剩空间不够存放另一位域时,则会从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
2.由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。如果最大长度大于计算机的整数字长,一些编译器可能会允许域的内存重叠,另外一些编译器可能会把大于一个域的部分存储在下一个字中。
3.位域可以是无名位域,这时它只用来作填充或调整位置。无名的位域是不能使用的.
4.位域在本质上就是一种结构类型,不过其成员是按二进位分配的。
5.结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
6.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding)。即结构体成员的末地址减去结构体首地址(第一个结构体成员的首地址)得到的偏移量都要是对应成员大小的整数倍。
引用:https://www.runoob.com/cprogramming/c-structures.html