【C言語】第一章-初識C言語-3


第3節
共通キーワード
  C言語には32のキーワードがありますが、キーワードは私たちのライターが使用する鍵であり、最も重要なのは、キーワードが変数名として定義されることを許可されていないことです.
auto break case char const continue default do double 
else enum extern float for goto if int long register 
return short signed sizeof static struct switch typedef 
union unsigned void volatile while

次に、一般的なキーワードをいくつか簡単に紹介します.  1、typedefキーワードはタイプ定義キーワードであり、ここでは烈性名の変更と理解すべきである.例:typedef unsigned int uint_32;この文を書いた後、uint_32を使って変数を定義する効果はunsigned intを使って変数を定義する効果と同じで、コードを書くのに苦労したと言える.  2、staticキーワードによく使われる3つの用途は、  1)局所変数を修飾し、局所変数のライフタイムをプログラム全体の存在時間まで延長することである.
#include //     
#include 
void test()//test  
{
	static int i = 0;//        
	i++;
	printf("%d ", i);
}
int main()//   ,    
{
	for (int i = 0; i < 10; i++)//          
	{
		test();
	}
	printf("
"); system("pause"); }

このプログラムではtest()関数でi変数を定義する前のstaticを削除して、実行結果がどのように異なるかを確認してみましょう.  2)グローバル変数の修飾:static修飾されたグローバル変数は、他のソースファイルでは使用できません.  3)修飾関数:static修飾された関数も他のソースファイルで使用できなくなり、コンパイルが間違って報告されます.
define定数とマクロの定義
 定数を説明する前にdefineを使用して定数を定義することを説明しましたが、defineの役割は定数を定義するだけではありません.defineの本質はテキスト置換であるため,マクロの定義にも利用できる.
#include //     
#include 
#define ADD(x, y) ((x) + (y))//   
#define MAX 1000
int main()//   ,    
{
	int sum = ADD(2, 3);//   
	printf("%d\t", sum);
	sum = 10 * ADD(2, 3);
	printf("%d
", sum); system("pause"); }

  上記のコードから、defineを利用して関数定義のような機能を実現できることがわかりますが、defineは機能が強いが、簡単なテキスト置換しかできないという欠陥もあります.ADDで定義した外側カッコを下げて、内側カッコだけを残して、結果にどんな変化があるか見てみましょう.
ししん
皆さんはC言語を勉強する前に、C言語について多かれ少なかれ知っていたかもしれませんが、C言語の中で一番難しいのはポインタだと聞いたことがあると思います.ポインタが難しいです.のしかし、ここでは、ポインタは難しくありません.本当に難しいのはC言語のメモリ管理です.これこそ人の頭を大きくする場所で、メモリ管理はポインタと密接に関連しています.では、いったい何が指針なのでしょうか.私たちは大学に通っていたとき、寮に住んだことがあるはずです.各寮は管理を容易にするためにドア番号を持っています(これで衛生検査の時に寮の管理人が簡単にどの寮の不合格減点などを言い出すことができます)、更に私達の1つの寮の中で4人が住んでいると仮定して、このシーンを創立した後に私達のコンピュータのメモリを説明することができます.コンピュータのメモリの中で、類似の管理モードがあって、私達の全体のコンピュータのメモリは1つの大きい寮のビルですああ、この寮はいくつですか.後で検討します.この寮の内部には小さな部屋があります.(メモリスペース)、このような1つの部屋は1バイトで、それからこれらの部屋を管理しやすいように、私たちは各部屋に順番に対応する番号をつけました.これらの番号はメモリアドレスと呼ばれていますが、私たちが部屋に住んでいる人は、さっき1つの部屋を4人仮設したと言っていましたが、私たちの1つの部屋に住んでいる4人は1文字に相当します.1 byte=4 bit、1バイト=4ビットバイナリ数のため、セクションに対応する4つのバイナリビットのような大きなデータ情報.このようにみんなはコンピュータのメモリに対して大体の理解があるべきだと信じています.では、ポインタは何ですか.ポインタはデータ型にすぎませんが、特殊で、メモリアドレス、つまりナンバープレートが格納されています.ナンバープレートに基づいて部屋に住んでいる人を見つけやすいように使用されています.メモリアドレスを利用してデータを探すのは最も正確で速い方法です.しかし、その後、ポインタの使い勝手の良さにも多くの危険があることがわかります.  1、変数のアドレスを取り出すと?この問題では、以前に出会ったオペレータを説明する必要があります.このオペレータにはビットアンドプレイのほかにアドレスを取る機能があることは以前は知られていなかったかもしれませんが、C言語では主にアドレスを取るための用途と言わざるを得ません.
#include //     
#include 
int main()//   ,    
{
	int num = 10;
	printf("%p
", &num);// num system("pause"); }

上のプログラムの主な機能は、変数を定義し、この変数のメモリアドレスを印刷することです.このうち%pは、アドレスを出力するためのプレースホルダである.実行の結果、16進数の列であることがわかりますが、メモリのアドレスはメモリの中でカウントを容易にするために16進数で表されることが多いです.4ビットの2進数の上限はちょうど1ビットの16進数の上限に等しいからです.変数に対してアドレスを取る操作も簡単で、& を使えばよい.  2、ポインタの定義と初期化
#include //     
#include 
int main()//   ,    
{
	int num = 10;
	int* p;
	p = &num;//int* p = &num;
	system("pause");
}

  このコードでは、まず変数numを定義して10に初期化し、その後ポインタpを定義し、その後、その内容をnumのメモリアドレスとして格納し、このポインタpを変数numを指すと呼ぶ.ポインタの定義構文も簡単ですが、通常の変数を定義するように定義するだけでいいです.異なるのは、定義時にデータ型の後に変数名に*を付ける必要があります.ここでは、ポインタが定義された後、できるだけ早く初期化し、一時的に使用しなくてもNULLに値を割り当てることに注意してください.int* p = NULL;という点は非常に重要です.そうしないと、後で私たちのプログラムの作成では、私たちの仕事を妨害するために野のポインタが現れやすくなります.(多く言えば涙)  3、ポインタの使用  ポインタの使用はあまりにも博大で奥深く、ここではまず最も簡単な例を例に挙げます.
#include //     
#include 
int main()//   ,    
{
	int num = 10;
	int* p = &num;
	*p = 20;
	printf("%d
", num); system("pause"); }

以上のコードは主にポインタpで事前に定義された変数を指しています.しかし、*p = 20;でポインタを操作して変数を再割り当てました.(*も解凍符です.簡単に言えばポインタでポインタが指すメモリスペースを見つけるためのオペレータです).これはどうやってできたのでしょうか.実は私たちが前にメモリを紹介したように、寮の部屋番号をポインタに入れて、ポインタで指定した部屋番号を見つけると、プログラマーは宿管に相当し、部屋番号も考えられますこの部屋の中の人を何人か変えるのはまだ楽なことではない.したがって,ポインタを用いて指定されたメモリ領域を見つけてメモリ領域内のデータの修正を行うことはポインタの得意技である.高度な利便性がかえって私たちのプログラムに多くの不安全な場所をもたらしただけに、ポインタ管理が適切でなければ野ポインタが現れると予想外の結果をもたらす可能性があります.そのため、慎重に使用してください.管理に気をつけてください.また、ポインタはデータ型なので、メモリに割り当てられたスペースでデータを格納しているに違いありませんが、ポインタはどのくらいのメモリスペースを占めていますか?**32ビットシステムでは、どのタイプのポインタでも4バイトのメモリ容量しか消費されません.**この点は皆さんがしっかり覚えておく必要があります.後日のポインタを深く勉強する中で、私たちはポインタに対してももっと深い理解と認識を持っています.最終的には、ポインタは本当にC言語の「屠龍刀」であることがわかります.
こうぞうたい
構造体といえば、オブジェクト向けのプログラミングと言わざるを得ません.よく知られているように、C言語は古い言語なので、昔の人がC言語を設計したところは、それを使って多くの大型のプログラムを作ることを考慮していませんでした.将来のプログラムがどの程度進化するか想像できません.そのため、C言語が設計されているのは、現在の大規模なプログラムの作成が困難といえるが、その主な原因はC言語がプロセス向けプログラミングであることであり、このようなプロセス向けプログラミング言語では大型プログラムの作成がプロジェクト管理に非常に不便であるため、比較的先進的なプログラミング言語の設計では、設計者は一般的にオブジェクト向けプログラミングというプログラミング言語設計モデルを用いており、このようなオブジェクト向けデザインは大型プロジェクトの管理が容易で、作成が容易で、CPP、java、VBなどはオブジェクト向けのプログラミング言語である.さてCPPではプロセス指向からオブジェクト指向への飛躍はどのように行われているのでしょうか.これはクラスというプレートを使いますが、実はC言語ではオブジェクト向けプログラミングの前身のようなものを見つけることができます.このオブジェクトは構造体です.  1、構造体の定義  構造体は、カスタムタイプと理解できる.ユーザーは、必要に応じて実用的な変数タイプを定義します.
struct Stu//        
{
	char name[1024];//  
	int age;//  
	char sex[5];//  
	char id[15];//  
};

以上のコードはstructキーワードを利用して構造体の定義を行い、構造体の内部でメンバー変数をカスタマイズすることができます.これらはすべてプログラマーが自分で決定しますが、このような自分で定義したタイプは自然に私たちが勝手に使用することができます.  2、構造体で変数を定義して初期化します.構造体タイプのカスタマイズが完了したら、このタイプで変数を定義し、この変数を使用します.
#define _CRT_SECURE_NO_WARNINGS
#include //     
#include 
#include 
struct Stu//        
{
	char name[1024];//  
	int age;//  
	char sex[5];//  
	char id[15];//  
};
int main()//   ,    
{
	//struct Stu s = { "Misaki", 20, " ", "20181031" };//              
	struct Stu s;
	strcpy(s.name, "Misaki");
	s.age = 20;
	strcpy(s.sex, " ");
	strcpy(s.id, "20181031");
	printf("  :%s
", s.name); printf(" :%d
", s.age); printf(" :%s
", s.sex); printf(" :%s
", s.id); system("pause"); }

  以上のコードでは、自分で定義した構造体タイプで変数を定義しました.もちろん、ここでは2つの初期化方法を提供しています.どちらを使用するかは状況によって異なります.初期化後に構造体を用いて操作する、初期化された変数内部の情報を出力し、この場所で構造体変数名を用いることが分かると信じている.メンバー変数の方式は勝手に構造体の変数を呼び出すことができて、とても便利で速いです.構造体については、今後、大規模なプログラム開発でよく使われています.ここでは初歩的な紹介だけをします.その後、深く勉強すると、より詳細な説明があります.