c言語 Hellow world 基本的な文字の出力(printf文 )のやり方!
この記事ではc言語のprintfという関数を使って文字を出力させる方法を紹介します!
プログラミングを勉強したいけど全くわからないって方々に向けた記事になります。
プログラムを書いたことがない方にとって、プログラムは全く意味のわからない英語が羅列されているイメージだと思いますが、そんなことないんです!
少しずつでいいので頑張って勉強していきましょう!
c言語 printf関数って何?
文字や数字などの何らかのデータを出力することのできる関数です。
数字をそのまま指定して「1」と表示させたり、文字をそのまま指定して「こんにちは」と表示させるのはもちろんのこと、変数の中に格納されている文字列や数字を表示させることもできます。
printfの使い方
printf("文字列");
と入力することで任意の文字列を出力することができます。
printf("出力フォーマット指定子",変数名);
と入力することで任意の変数を出力することができます。
フォーマット指定子については以下の表を見るとわかりやすいと思います。
指定子 |
対応する型 |
説明 |
使用例 |
%c |
char |
1文字を出力する |
"%c" |
%s |
char * |
文字列を出力する |
"%9s", "%-11s" |
%d |
int, short |
整数を10進で出力する |
"%-2d","%06d" |
%u |
unsigned int, unsigned short |
符号なし整数を10進で出力する |
"%2u","%02u" |
%o |
int, short, unsigned int, unsigned short |
整数を8進で出力する |
"%09o","%03o" |
%x |
int, short, unsigned int, unsigned short |
整数を16進で出力する |
"%04x" |
%f |
float |
実数を出力する |
“%4.2f" |
%e |
float |
実数を指数表示で出力する |
“%2.3e" |
%g |
float |
実数を最適な形式で出力する |
"%g" |
%ld |
long |
倍精度整数を10進で出力する |
"%-10ld" |
%lu |
unsigned long |
符号なし倍精度整数を10進で出力する |
"%7lu" |
%lo |
long, unsigned long |
倍精度整数を8進で出力する |
"%10lo" |
%lx |
long, unsigned long |
倍精度整数を16進で出力する |
"%07lx" |
%lf |
double |
倍精度実数を出力する |
“%9.3lf" |
c言語 Hellow worldと出力するプログラム
次に、実際にHellow woreldと出力するプログラムを書いてみましょう。
#include <stdio.h>
main()
{
printf("Hello World\n");
}
このままコピペしていただけると「Hello world」と出力することができます。
開発環境がある方は単に実行していただけると出力することができると思います。
開発環境がない方は以下のサイトを利用するのが簡単なのでおすすめです。
Hello worldサンプルコード解説
最初の「#include <stdio.h>」という部分はおまじないだと教わった方も多いと思います。
これにはちゃんと役割があって、「stdio.h」という標準Cライブラリをインクルードしています。
簡単に説明するとprintf関数のような使用頻度が高い関数がstdio.hというライブラリの中で定義されていて、インクルードすることでそれらの関数を使えるようになります。
基本的に関数というものは定義しなければ使うことができません。しかし、よく使う関数を自分で毎回定義していくのは大変なので、ライブラリの中で定義されているんです。
おまじないだーという認識ではなく、ちゃんと意味があるんだなということだけ覚えておいてください。
続いてmain()
{
}
についてですが、これはこのプログラムにおいて、ここがメインで動かすところですよ。
という意味になっています。
最後に「printf("Hello world\n");」という部分で Hellow world という文字を出力しています。
「/n」というのは改行の意味があります。
例えば「printf("Hello world");」とだけ入力することで、改行がなくなります。出力を複数回行う場合は改行がないと非常に見辛くなってしまいます。
また、「printf("こんにちは\n");」と入力することで、「こんにちは」と出力することができるようになります。
まとめ
この記事では、printf文を使って任意の文字列を出力する方法を解説させていただきました。
c言語をこれから勉強していきたいと思っている方々のお役に立てれば幸いです。
c言語は難しいんだろうなって思う方々でもこの記事を見ていただければprintf文で任意の文字列を出力したいときの使い方は分かっていただけたと思います。
少しずつでいいのでc言語についての知識を深めていきましょう。
この記事を読んでいただいてありがとうございました。
C言語 malloc関数について(free,memset,memcpy,memcomp)はこれを読め!
malloc関数は配列や構造体を使う時にメモリを動的に割り当てることができる関数です。
是非この記事を読んでmalloc関数とそれに関係するメモリ操作系の関数について理解を深めてください!
mallocで確保したメモリはmemset,memcpy,memcmpなどの関数を使って様々なことができます。
malloc関数を使いこなすことができれば、汎用性が高く、メモリを無駄に使わないスマートなコードを書くことができます!
c言語を扱う上ではぜひ身につけてほしい技術なのでこの記事を読んで詳しくなりましょう!
c言語 malloc関数とは
malloc関数とは動的にメモリを確保する関数です。
配列や構造体を使ってあらかじめメモリを確保することなく、必要な場所で必要な分だけのメモリを使用することができるようになります。
木構造やリストなどのデータ構造は、一般的にmalloc関数によって動的にメモリを確保します。
ヘッダーファイル「stdlib.h」をインクルードすることによって使用可能です。
引数で指定したバイト数のメモリを確保し、確保した領域へのポインタを返します。
確保したメモリはfree関数で解放しないと他の処理でそこのメモリを使うことができなくなるので忘れないようにしましょう!
malloc関数の書式
malloc関数の書式は以下のようになります。
#include<stdlib.h>
void* malloc(size_t len);
「void*」の部分を(char*)などに差し替えてキャストします。
「site_t len」の部分に確保したいバイト数を入れてあげます。
※malloc関数で確保したメモリは必ずfree関数で解放しましょう
c言語 malloc関数の使い方について
mallo関数を使用するにはヘッダーファイル「stdlib.h」をインクルードすることが必須になります。
malloc関数の引数にはsizeof関数を使って配列の要素数や構造体の型を指定し、求めているバイト数を入力します。
これを構造体の型のポインタや配列の型のポインタでキャストして使用していきます。
サンプルコードを以下に示します
構造体の宣言は普段通りに行っていただき、このように処理していくことでmalloc関数を用いてメモリを動的に割り当てることができます。
c言語 malloc関数に関係する関数の使い方
malloc関数で確保したメモリを扱う関数についてです。
代表的なmemset,memcpy,memcmpについて説明します。
memsetの使い方について
memset関数は主にメモリの初期化に使用されます。
memset関数を使用するにはヘッダーファイル「string.h」をインクルードする必要があります。
memset関数の1引数にはメモリを設定したいオブジェクトのアドレス、
2引数にはメモリにセットしたい値、
3引数にはメモリにセットしたい値の文字数を入力してあげます
以下にサンプルコードを示します
出力は
01*****789
になります
str+2つまり2が格納されている部分のアドレスから5個分を*に置き換えます。
memcpyの使い方について
memcpy関数は指定したバイト数分のメモリをコピーしてくれる関数です。
memcpy関数を使用するにはヘッダーファイル「string.h」をインクルードする必要があります。
1引数にコピー先のメモリブロックのポインタ、
2引数にコピーもとのメモリブロックのポインタ、
3引数にはコピーしたいサイズ
を入力してあげます。
以下にサンプルコードを示します。
出力は以下のようになります
コピー前 中身の確認
0x1 0x1 0x1 0x1 0x1 0x1 0x1
コピー後 中身の確認
0x61 0x62 0 0x63 0x64 0x1 0x1
memcmpの使い方について
memcmp関数は指定したバイト数分のメモリ領域を比較してくれる関数です。
1引数と2引数に比較したいオブジェクトのポインタ
3引数には比較したいバイトサイズ
を入力してあげます。
memcmp関数はint型の値を返し、戻り値が0の場合は比較したオブジェクトは一致していると判定され、それ以外の値の場合はオブジェクトは一致していないと判定されます。
いかにサンプルを示します。
出力は以下のようになります。
buf1 = buf2
buf1 != buf3
free関数の使い方について
free関数はmalloc関数で確保したメモリを解放することができる関数です。
free関数の戻り値はvoid型となります。
引数には解放したい領域のポインタを使用します。
書式は以下のようになります。
free(ポインタ);
まとめ
この記事ではmalloc関数の使い方について解説をしました。
他にもmalloc関数に関係するmemset、memcpy、memcmp、freeといった関数についても説明しました。
これらの関数を使いこなすことによってメモリについての理解が深まり、一味違ったコーディングができるようになります!
この記事をよく読んで理解して、メモリについての知識を深めてください!
読んでくださりありがとうございました!
c言語 2次元以上の多次元配列 これを見たら誰でもわかる!
どうも!ムバサです!
この記事ではC言語の2次元以上の多次元配列について徹底解説をしています!
この記事を読めば誰でも2次元配列についてわかるように使い方をソースコードと共に掲載しているので是非参考にしながら学習してみてください!
c言語 多次元配列とは?
多次元配列とは
2次元以上の配列。つまり1次元配列以外の配列のことを指します。
1次元配列については以下の記事にて詳しく解説しています!
1次元配列とは
「1x◯」の要素を持った配列です。イメージとしては配列を図に表した時に直線になる配列です。
掛け算の九九で言うところの「1の段」とか「2の段」ですね。
2次元配列とは
「◯x△」の要素を持った配列です。イメージとしては配列を図に表した時に平面になる配列です。
掛け算の九九そのものが2次元配列になります。
3次元配列とは
「◯x△x⬜︎」の要素を持った配列です。イメージとしては配列を図に表した時に立体になる配列です。
ルービックキューブの形をイメージしてください。まさにあんな感じです。
その他
4次元配列とか難しい配列もあります。
これらを踏まえて、二次元以上の配列のことを「多次元配列」って呼びます。「多数」の「次元」を持つ「配列」で「多次元配列」ということになります
1次元じゃない配列は多次元配列なんだなぁ〜って解釈で大丈夫です!
c言語 2次元配列の使い方
c言語 2次元配列の宣言・初期化
2次元配列の宣言と初期化はどうやるの?という疑問についてお答えします。
2次元配列は
データ型 配列名[行数][列数] = {{要素[0][0],要素[0][1],.......},{要素[1][0],要素[1][1],......}};
という形で宣言します。「{}」で要素全部を囲って、その中にさらに「{}」で行ごとに区切り、「,」で列ごとに区切っていきます。
変数の宣言と同時に初期化を行うサンプルを以下に示します。
普通の変数で int i=5; とやるのと同じイメージです。
次に要素1つずつに代入をして宣言と初期化を行う時のサンプルを以下に示します。
これを応用すると、scanf文を使ってキーボードから任意の値を代入することができます。以下に例を示します。
もちろん文字列型でも配列が使えます。書式は基本的に変わりませんが少し違ってきます。以下に例を示すので確認してみてください。
いやこれ1次元配列じゃね?と思った方いるかもしれませんが、ちゃんと2次元配列になっています。
文字列の配列というのは「sendai」という文字列を格納するのに1次元分利用してしまいます。
つまり複数の文字列を格納するには2次元配列を利用しているのです。
c言語 2次元配列のポインタ
2次元配列をポインタで使う場合には、2次元配列を分解して、1次元配列ごとにポインタを使い、それをまとめて使います。
c言語 2次元配列のポインタを扱う上で
ここで、2次元配列を使う上で便利な関数を紹介します。
固定の長さの配列ではなく、動的に要素をあり当てる際にはmalloc関数を使用します。
配列ではmalloc関数の引数に配列の要素数を指定して、必要なバイト数をを確保してもらいます。
ちなみにですが、プログラムの中でmalloc関数でメモリを確保した後にはfree関数というものを使ってメモリを解放してあげましょう。
メモリを解放しないと、プログラムが実行中そのメモリ領域が独占されてしまうため、他のプログラムに使用できなくなってしまいます。
malloc関数、free関数の使い方や詳しい解説については以下の記事を参照してください
ちなみに、malloc関数とfree関数では「stdlib.h」というヘッダーファイルをインクルードする必要があるので注意しましょう。
2次元配列として扱う方法
2次元配列として扱う場合には、各行のデータにアクセスするためのアドレスと、そのアドレスを保持するためのポインタが必要になります。
2次元配列を1次元配列ごとに分解してポインタで参照する感じですね。
イメージしやすいように図に表すとこんな感じになります
どのように使うのか?は以下にサンプルを示します。
このコードを実行した結果は以下のようになります。
このプログラムでは変数「m」で何列か、変数n「n」で何行か、ということを定義しています。
0から1ずつ増やしていくのをn行m列分出力するプログラムです。
free関数によってメモリを解放していないのは、このプログラムでしか使わないので、特に問題がないためです。
Arrayにアスタリスクが2つついているのは、ポインタのポインタという意味です。
これは変数を間接的に参照しているポインタ自身がどこかのアドレスに格納されているため、そのアドレスの場所を参照するものです。
ポインタのポインタに関しては今後詳しい記事を記述します
Array = malloc(sizeof(int *) * n);
というコードでn行分の領域を確保しています。
Arrayでは各行の先頭のアドレスが格納されているアドレスの先頭のアドレスを参照しています。複雑ですね。
int型のポインタとして利用するために「(int *)」でキャストします。
ポインタのポインタとして使うため、nの前に「*」をつけて合わせてあげます。
次に
Array[i] = malloc(sizeof(int) * m);
というコードで1行あたりm列分の領域を確保しています。
先ほど行分の領域を確保したことにより、「Array[i]」という書き方ができるようになります。
Array[i]では各行の先頭のアドレスを参照します。
ここまできて、「Array[i]」を先頭として、m列分の配列が使えますよ!ってことになります。
かなり複雑ですが実際にコードを動かしてみて、イメージを掴めればわかりやすくなると思います。
要点をまとめると「Array[i][j]」という配列の要素を使うために各列の先頭のアドレスが格納されている「Array[i]」というポインタを使います。
そして「Array[i]」というポインタがn個分作られて格納されているので、それを使うために「Array」というポインタのポインタを使うのです。
c言語 3次元以上の配列の使い方は?
c言語では配列の次元をいくらでも増やすことができます。
しかしながら大抵は2次元配列で足りてしまい、多くても3次元配列までしか使われないことがほとんどです。
(4次元配列を使った方がいい場合などもあるようですが。)
ということで、3次元配列の使い方です。
1次元配列から2次元配列になった時と同じように「[]」の数を一つ増やしてあげればOKです。簡単なサンプルを示します。
このようにして宣言、初期化を行います。2次元配列についての理解ができている方ならなんとなくわかりますよね。
2次元配列では「縦x横」のイメージになっていたと思いますが、3次元配列ではそこに高さが加わり、「縦x横x高さ」というイメージを持ってもらえるとわかりやすいです。
いくつもの2次元配列が高く重なり合っている状態のものが3次元配列ということになります。
まさにルービックキューブのような感じです。
まとめ
この記事では主に2次元配列についての説明を行いました。
2次元配列は1次元配列に比べてポインタでの扱いが非常に複雑になりますよね。
2次元配列は単に、1次元配列の集合である、ということが直感的に理解できれば扱い方もわかってくると思います。
2次元配列を使いこなすことができればc言語でのプログラミングの幅が大きく広がります。
この記事を参考に実際にプログラムを書いてみてわかるまで繰り返しましょう!
読んでくださってありがとうございました。
少しでもいいなと思った方は読者登録やTwitterのフォローお願いします!