月ノ書

いまさら聞けない!C言語のポインタと配列の違い

配列とポインタは「似ている」のではなく
似た振る舞いをする瞬間があるだけです

この記事では

そんなモヤっとを、構造から整えていきます

まず、いきなり結論を言います

配列は「実体」
ポインタは「参照」

ここがすべてです

なぜ同じに見えるのか

int a[5] = {1,2,3,4,5};
int *p = a;

どちらも

a[0]
p[0]

と書けます

だから混乱します

しかし中身はまったく違います

配列の正体

a はこの領域そのものです

a
「先頭アドレスを表す式」に変換されることはありますが、実体を持つ変数です

重要なのはここです

配列はメモリを“所有”しています

ポインタの正体

p の中身は「1000」という数値
つまりアドレスです

p 自体は、配列を持っていません

決定的な違い①:sizeof

int a[5];
int *p = a;

sizeof(a); // ?
sizeof(p); // ?

64bit環境なら

になります

なぜか

ここを説明できるかが理解の分かれ目です

決定的な違い②:代入できるか

int a[5];
int b[5];

a = b;   // コンパイルエラー

配列は代入できません

なぜなら
配列は「固定された実体」だからです

一方

int *p;
int *q;

p = q;   // OK

ポインタはアドレスを書き換えられます

決定的な違い③:関数引数での挙動

void func(int arr[5]);

これは実際には

void func(int *arr);

と同じです

ここで

「ほら、配列はポインタじゃん」

と思いがちですが、違います

配列は

関数に渡された瞬間
ポインタに変換される

だけです

これを「配列の退化」と呼びます

関数呼び出し時の変換

実体は外側
関数内ではアドレスのみ

よくある誤解

配列名はポインタ変数である

これは誤りです

配列名は

つまり

ポインタっぽい振る舞いをする式

であって
ポインタ変数ではありません

配列ポインタとポインタ配列

ここも混乱ポイントです

int (*p)[5];  // 配列へのポインタ
int *p[5];    // ポインタの配列

まったく違います

前者は
5要素配列を指すポインタ

後者は
ポインタを5個持つ配列

宣言は右から読む

これを意識すると整理できます

実務視点での違い

設計の観点では

配列は

ポインタは

配列は「箱」
ポインタは「接続」

役割が違います

まとめ

配列とポインタは似ています
しかし本質はまったく違います

配列は

ポインタは

この違いを
sizeof・代入可否・関数引数
この3点で説明できれば

理解はかなり深い位置にあります

C言語ポインタを“理解した人”になるための再整理

C言語のポインタは「分かったつもり」から「使いこなせる」に変わる瞬間があって、そこを越えるとコードの見え方が一気に変わります

この記事は、

そんな方に向けた内容です

「アドレスを持つ変数」という説明で止まっていませんか
「*と&の記号操作」に意識が向いて、本質がぼやけていませんか

ここでは、ポインタを 概念 → メモリ構造 → 設計視点 の順で整理していきます

ポインタは「値」ではなく「関係性」

多くの人がポインタを

アドレスを格納する変数

と理解します

もちろん正しいです
ただし、それだけでは浅いです

本質は

あるデータと別の場所を“つなぐ仕組み”

です

int x = 10;
int *p = &x;

ここで重要なのは

ポインタは「値のコピー」ではなく「実体への参照経路」です

なぜポインタが必要なのか

ここが曖昧なままだと応用で詰まります

1. コピーを防ぐ

大きな構造体を値渡しするとコピーが発生します

void update(struct Data d);   // コピー
void update(struct Data *d);  // 参照

設計の段階で「コピーさせるか」「実体を触らせるか」を選択できるのがポインタです

2. 動的メモリ管理

int *p = malloc(sizeof(int));

スタックではなくヒープを扱う
これは実務で必須です

3. データ構造の実装

リスト、ツリー、グラフ
すべてポインタ前提です

ダブルポインタで止まる理由

int **pp;

これは

実体を指すポインタを指すポインタ

言葉にすると混乱します

整理すると

x ← p ← pp
x  : 10
p  : &x
pp : &p

ダブルポインタは

で使われます

現役プログラマ視点でのポインタ

実務で大事なのは

「何を指させるか」より
「どこまで責任を持つか」です

ポインタは便利ですが、責任境界を曖昧にすると事故になります

設計段階で

を明確にする

これがポインタ理解の“深い段階”です

よくある混乱ポイント

1. 配列とポインタの違い

int a[5];
int *p;

配列は実体
ポインタは参照

sizeof(a)sizeof(p) が違う理由を説明できるか
ここが理解の指標です

const の位置

const int *p;
int *const p;

どちらが何を固定しているか

これは

という設計の違いです

ポインタ理解が進むと何が変わるか

C言語のポインタは、低レイヤ理解の入口です

まとめ

ポインタは

です

記号操作ではなく

ここまで到達すると
ポインタは怖いものではなくなります

SwiftでのMapと連想配列応用|配列・Dictionaryの便利メソッド活用

この記事でわかること
  • SwiftでのMap操作の基本と応用
  • 配列やDictionaryに対するmapfilterreduceの使い方
  • キーと値を使った変換やデータ整理テクニック
  • 実用例で学ぶデータ処理の効率化

SwiftのMapとは

Swiftではmapというメソッドを使うことで、配列や辞書の要素を変換することができます

map以外にも、filterreduceを組み合わせると、データ処理がもっと柔軟になります

配列でのMap応用

基本

let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 }  // [1, 4, 9, 16, 25]

Filterと組み合わせ

let evenSquares = numbers.filter { $0 % 2 == 0 }.map { $0 * $0 }  // [4, 16]

Reduceで合計を計算

let sum = numbers.reduce(0, +)  // 15

DictionaryでのMap応用

値だけ変換

let capitals = ["日本": "東京", "フランス": "パリ"]
let upperCapitals = capitals.mapValues { $0.uppercased() }
// ["日本": "東京", "フランス": "PARIS"]

条件付きで抽出して変換

let filteredCapitals = capitals
    .filter { $0.key.hasPrefix("日") }
    .mapValues { $0 + "市" }
// ["日本": "東京市"]

実践的なデータ整理テクニック

文字列配列をDictionaryに変換

let fruits = ["りんご", "みかん", "バナナ"]
let fruitLengths = Dictionary(uniqueKeysWithValues: fruits.map { ($0, $0.count) })
// ["りんご": 3, "みかん": 3, "バナナ": 3]

Dictionaryをソート

let sortedCapitals = capitals.sorted { $0.key < $1.key }
for (country, capital) in sortedCapitals {
    print("\(country): \(capital)")
}

Dictionaryの値の集計

let sales = ["A": 100, "B": 200, "C": 150]
let totalSales = sales.values.reduce(0, +)  // 450

まとめ

SwiftのmapmapValuesを使うと、配列やDictionaryの要素を簡単に変換できる
filterreduceと組み合わせると、条件抽出や集計などの高度なデータ処理も効率的に行える
実務でよくあるデータ整理・変換の多くは、この組み合わせでシンプルに書ける
慣れてくると、「一度に変換・集計・フィルタリング」がスマートにできるので、コードがすごく読みやすくなる

SwiftでDictionaryを使いこなす方法|キーと値で管理する便利データ構造

この記事でわかること
  • SwiftのDictionaryの基本概念
  • Dictionaryの作成方法と要素の追加・削除・更新
  • キーによる検索や存在チェック
  • 配列やSetとの違い、便利なメソッドの活用

SwiftのDictionaryとは

Dictionaryは「キーと値」のペアでデータを管理するデータ構造です
キー(Key)はユニークで、値(Value)は任意の型を持つことができます
簡単に言うと、「名前で値を管理する箱」のようなイメージです

特徴配列(Array)SetDictionary
順序順序あり順序なし順序なし(Swift5以降は挿入順を保持)
重複値は可能不可キーは不可、値は可能
検索インデックスO(1)キーで高速アクセス可能

Dictionaryの基本操作

作成

var capitals: [String: String] = [
    "日本": "東京",
    "アメリカ": "ワシントンD.C.",
    "フランス": "パリ"
]

要素の追加・更新

capitals["イギリス"] = "ロンドン"   // 新しい要素を追加
capitals["日本"] = "京都"           // 既存の値を更新

要素の削除

capitals.removeValue(forKey: "アメリカ")

値の取得

if let capital = capitals["フランス"] {
    print("フランスの首都は \(capital)")
}

Dictionaryの便利な使い方

キーの存在チェック

if capitals.keys.contains("日本") {
    print("日本の首都が登録されている")
}

ループでの操作

for (country, capital) in capitals {
    print("\(country) の首都は \(capital)")
}

値だけ、キーだけを取り出す

let allCountries = Array(capitals.keys)
let allCapitals = Array(capitals.values)

まとめ

Dictionaryは「キーで値を管理する便利な箱」
検索や更新が高速で、データを整理して扱うのに最適
配列やSetと使い分けることで、Swiftでのデータ処理がより効率的になる
慣れてきたらmapValuesfilterなどを活用して、さらにスマートに操作できる

SwiftでSetを使いこなす方法|重複なしデータの管理と基本操作

この記事でわかること
  • SwiftのSetの特徴と基本概念
  • Setの作成方法と要素の追加・削除
  • Setを使った重複チェックや集合演算
  • 配列との違い、便利なメソッドの活用

SwiftのSetとは

Setは「重複しない値の集まり」を扱うデータ構造です
順序は保証されず、同じ値を複数持つことはできません
配列との違いをまとめるとこんな感じ

特徴配列(Array)集合(Set)
順序順序あり順序なし
重複可能不可
検索速度O(n)O(1)(平均)

Setの基本操作

作成

var fruits: Set<String> = ["りんご", "みかん", "バナナ"]

要素の追加

fruits.insert("ぶどう")

要素の削除

fruits.remove("みかん")

要素の確認

if fruits.contains("バナナ") {
    print("バナナが入っているよ")
}

Setの便利な使い方

集合演算

Setは集合演算が得意で、複数のSetを組み合わせることができます

let setA: Set = [1, 2, 3, 4]
let setB: Set = [3, 4, 5, 6]

let unionSet = setA.union(setB)         // 和集合
let intersectionSet = setA.intersection(setB) // 積集合
let differenceSet = setA.subtracting(setB)    // 差集合

重複の排除

配列の重複を簡単に削除したいときは、Setに変換するだけ

let numbers = [1, 2, 2, 3, 3, 3]
let uniqueNumbers = Set(numbers)

まとめ

Setは「順序を気にせず、重複を許さないデータ管理」ができる
集合演算や重複チェックを簡単に行えるので、配列より効率的な場合も多い
配列との使い分けを理解しておくと、Swiftのデータ処理がもっとスムーズになる

Swiftで配列を使いこなす方法|基本操作から応用テクニックまで

この記事でわかること
  • Swiftで配列(Array)を作成する方法
  • 配列へのデータの追加・削除・変更の基本操作
  • 配列の検索や並び替え、フィルタリングのテクニック
  • 配列のイテレーションや便利なメソッドの活用方法

Swiftの配列とは

Swiftの配列(Array)は、同じ型の値を順序付きで格納できるデータ構造です
Arrayは非常に柔軟で、要素の追加・削除・並び替え・検索などが簡単に行えます
例えば整数のリスト、文字列のリスト、オブジェクトのリストなどを扱うことが可能です

var numbers: [Int] = [1, 2, 3, 4, 5]
var fruits: [String] = ["りんご", "みかん", "バナナ"]

配列の基本操作

要素の追加

配列の末尾に要素を追加するにはappendを使います

fruits.append("ぶどう")

特定の位置に追加したい場合はinsert(_:at:)を使います

fruits.insert("メロン", at: 1)

要素の削除

末尾の要素を削除する場合はremoveLast()を使います

fruits.removeLast()

指定した位置の要素を削除する場合はremove(at:)を使います

要素の変更

インデックスを指定して要素を変更できます

fruits[0] = "スイカ"

配列の便利な操作

ループでの操作

配列の要素を順に取り出すにはfor-inを使います

for fruit in fruits {
    print(fruit)
}

検索

配列の中に特定の値があるか調べるにはcontainsを使います

if fruits.contains("バナナ") {
    print("バナナが入っているよ")
}

並び替え

配列を昇順や降順に並べ替えるにはsortsortedを使います

numbers.sort()        // numbersが昇順に並び替えられる
let reversedNumbers = numbers.sorted(by: >) // 降順で新しい配列を作る

フィルタリング

条件に合う要素だけを取り出すにはfilterを使います

let evenNumbers = numbers.filter { $0 % 2 == 0 }

まとめ

Swiftの配列は非常に使いやすく、データの追加・削除・検索・並び替え・フィルタリングなど、多彩な操作が可能
基本を押さえておくだけでも多くのプログラムで活用できる
慣れてきたらmapreducecompactMapなどの便利メソッドも試してみるとより効率的にデータを扱える

Pythonのjoinで文字列結合|リストやタプルの要素をまとめて1つの文字列に

今回の記事でわかること
  • Pythonで文字列を結合する方法
  • join() メソッドの基本的な使い方
  • リストやタプルの要素をまとめる方法
  • 区切り文字を指定して結合する方法
  • 応用例と注意点

join()とは

join() メソッドは、リストやタプルの要素を指定した文字列で結合して1つの文字列にするメソッドです

fruits = ["りんご", "バナナ", "みかん"]
result = ",".join(fruits)
print(result)  # りんご,バナナ,みかん

空白や他の文字で結合

words = ["Python", "は", "便利"]
result = " ".join(words)
print(result)  # Python は 便利

result = " - ".join(words)
print(result)  # Python - は - 便利

タプルでも使用可能

numbers = ("1", "2", "3")
result = "-".join(numbers)
print(result)  # 1-2-3
numbers = (1, 2, 3)
# result = "-".join(numbers)  # エラーになる
numbers = (1, 2, 3)
result = "-".join(str(n) for n in numbers)
print(result)  # 1-2-3

splitと組み合わせる

文字列を分割して加工して、再度結合することもできます

text = "りんご,バナナ,みかん"
fruits = text.split(",")  # 分割
result = " & ".join(fruits)  # 結合
print(result)  # りんご & バナナ & みかん

注意点

まとめ

文字列の分割(split)と結合(join)をマスターすると、Pythonでの文字列操作がほぼ自由自在になります

Pythonのsplitで文字列を分割する方法|区切り文字で簡単にデータを整理

この記事でわかること
  • Pythonで文字列を分割する方法
  • split() メソッドの基本的な使い方
  • 区切り文字を指定した分割方法
  • 複数区切りや最大分割数の指定
  • 実用的な例と注意点

split()とは

split() メソッドは、文字列を指定した区切り文字で分割してリストにするメソッドです

text = "りんご,バナナ,みかん"
fruits = text.split(",")
print(fruits)  # ['りんご', 'バナナ', 'みかん']

区切り文字を指定しない場合

区切り文字を指定しないと、空白(スペース)で分割されます

text = "Python は 便利"
words = text.split()
print(words)  # ['Python', 'は', '便利']

最大分割数を指定

maxsplit 引数で分割の最大回数を指定できます

text = "りんご,バナナ,みかん,メロン"
fruits = text.split(",", 2)
print(fruits)  # ['りんご', 'バナナ', 'みかん,メロン']

応用例:CSVデータの読み込み

line = "太郎,20,175"
name, age, height = line.split(",")
print(name)    # 太郎
print(age)     # 20
print(height)  # 175

注意点

まとめ

文字列を分割する方法を覚えると、データ処理や文字列操作の幅が大きく広がります

Pythonの文字列フォーマット|f文字列・format・%演算子で出力を整える方法

この記事でわかること
  • Pythonで文字列をきれいに整形する方法
  • f文字列(f-strings)の使い方
  • format() メソッドで変数を埋め込む方法
  • 旧式の % 演算子によるフォーマット
  • 数値や文字列の整形、桁揃えや小数点指定の方法

f文字列(f-strings)

Python 3.6以降で使える一番便利な方法です

name = "太郎"
age = 20

print(f"名前は{name}、年齢は{age}歳です")

出力:

名前は太郎、年齢は20歳です
width = 10
height = 5
print(f"面積は{width * height}です")  # 面積は50です

計算結果も直接埋め込めます

format() メソッド

古い方法ですが、Python 3でも使えます

name = "太郎"
age = 20

print("名前は{}、年齢は{}歳です".format(name, age))

番号を付けて順番を入れ替えることもできます

print("年齢は{1}歳、名前は{0}".format(name, age))

%演算子によるフォーマット(旧式)

C言語風の書き方です

name = "太郎"
age = 20

print("名前は%s、年齢は%d歳です" % (name, age))

数値の整形

f文字列を使うと、桁揃えや小数点の指定も簡単です

pi = 3.141592

# 小数点以下2桁まで
print(f"円周率は{pi:.2f}")  # 円周率は3.14

# 幅を指定して右寄せ
print(f"{pi:10.2f}")  #      3.14(10文字幅)

文字列の整形例

name = "太郎"
score = 95

# 左寄せ
print(f"{name:<10} {score}")  # 太郎       95

# 右寄せ
print(f"{name:>10} {score}")  #        太郎 95

表形式で並べたいときに便利です

まとめ

文字列フォーマットをマスターすると、出力の見た目もきれいに整えられて、プログラムの完成度がぐっと上がります

PythonでLINQ風操作をやさしく解説|リスト内包表記・map・filterでデータ処理を効率化

この記事でわかること
  • PythonでLINQ的な操作とは何か
  • リスト内包表記・map・filterを組み合わせた便利なデータ操作
  • 条件付きの抽出・変換・集計の方法
  • 複雑なリスト処理を効率的に書く考え方

C#のLINQのように、データを「絞る・変換する・集計する」操作を簡単に書く方法をPythonで理解できます

LINQ風操作とは

LINQは、C#でリストや配列を操作するときに使う便利な仕組みです
Pythonでは、リスト内包表記、map、filter、sumなどを組み合わせることで同じような操作ができます

例:条件で絞りつつ変換する

numbers = [1, 2, 3, 4, 5]

# 偶数だけを2倍にする
result = [x * 2 for x in numbers if x % 2 == 0]
print(result)  # [4, 8]

これだけで LINQでいうWhere + Select の操作ができます

mapとfilterで書く場合

同じ処理をmapとfilterで書くこともできます

numbers = [1, 2, 3, 4, 5]

# filterで偶数だけ抽出して、mapで2倍に変換
result = list(map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numbers)))
print(result)  # [4, 8]

この流れはLINQの WhereSelect に対応しています

集計も簡単

Pythonでは sumlen を組み合わせることで、集計もできます

numbers = [1, 2, 3, 4, 5]

# 偶数の合計
total = sum(x for x in numbers if x % 2 == 0)
print(total)  # 6

LINQでいう SumCount のような操作です

複数条件や組み合わせも可能

リスト内包表記で複雑な条件や組み合わせも簡単に書けます

numbers = [1, 2, 3]
letters = ["a", "b"]

# 全ての組み合わせ
result = [(n, l) for n in numbers for l in letters]
print(result)  # [(1, 'a'), (1, 'b'), (2, 'a'), ...]

LINQの SelectMany に相当する操作も直感的に書けます

注意点

まとめ

これで、Pythonでのデータ操作の基礎から応用まで、ほぼ一通り揃いました

この流れを理解すれば、初心者でも データを自由自在に扱うプログラム が書けるようになります