C言語で文字列へのポインタの配列とそのアドレスを出力する方法
まずは、C言語における「ポインタの配列」とは何かを確認しましょう。
文字列へのポインタの配列とは
各要素が、文字列の先頭アドレスを指すポインタになっている配列のことです。
宣言と初期化は次のように行います。
char *a[ ] = {"one", "two", "three"};
ここで、a[0] は文字列 "one" の、a[1] は "two" の、a[2] は "three" のそれぞれ先頭アドレスを指すポインタです。
イメージとしては、配列の各要素が対応する文字列の先頭番地を保持しており、その番地をたどることで文字列本体へアクセスできる構造になります。
ポインタの配列を使うメリット
2次元の文字配列とは異なり、文字列へのポインタの配列では、格納領域のサイズをあらかじめ固定する必要がありません。
各文字列は実際に必要なバイト数だけを占有するため、メモリの無駄が発生しません。
サンプルプログラム1:文字列とアドレスの出力
以下は、文字列へのポインタの配列の内容と、各要素が保持しているアドレスを出力するCプログラムです。
#include <stdio.h>
#include <string.h>
int main(void){
// 文字列へのポインタ配列とforループ用変数の宣言 //
int i;
char *a[5] = {"One", "Two", "Three", "Four", "Five"};
// forループで各位置の文字列を出力 //
printf("The values in every string location are : \n");
for(i = 0; i < 5; i++){
printf("%s\n", a[i]);
}
// forループで各文字列のアドレスを出力 //
printf("The address locations of every string values are : \n");
for(i = 0; i < 5; i++){
printf("%d\n", a[i]);
}
return 0;
}
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
The values in every string location are: One Two Three Four Five The address locations of every string values are: 4210688 4210692 4210696 4210702 4210707
※ 表示されるアドレス値は実行環境によって異なります。また、アドレスを出力する場合は、移植性の観点から %d ではなく %p を使うことが推奨されます。
サンプルプログラム2:ポインタ経由で文字列を出力
続いて、別の例を見てみましょう。以下は、ポインタを使って文字列の内容を1文字ずつ出力するCプログラムです。
#include <stdio.h>
#include <string.h>
int main(void){
// 文字列とポインタの宣言 //
char string[14] = "TutorialPoint";
char *pointer = string;
// ポインタを使って文字列を出力 //
printf("The string is : ");
while(*pointer != '\0'){
printf("%c", *pointer);
pointer++;
}
return 0;
}
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
The string is: TutorialPoint
このように、char型ポインタを文字列の先頭アドレスで初期化すれば、ポインタをインクリメントしながら1文字ずつ参照することで、文字列全体を順に出力できます。終端のヌル文字('\0')に到達した時点でループを終了させるのがポイントです。
-
配列の左回転をO(n)時間・O(1)空間で実現するC++プログラムの書き方
本記事では、サイズnの整数配列と複数の回転位置kが与えられたとき、指定されたインデックスkから配列を左方向へ回転させた結果を出力する方法を、時間計算量O(n)・空間計算量O(1)の制約のもとで解説します。 配列の左回転とは、各要素を左へk個分ずらし、はみ出した要素を右端に折り返して配置する操作です。例えば、配列 {1, 2, 3, 4, 5} を1回左に回転すると {2, 3, 4, 5, 1} になります。 この手法の鍵となるのは剰余演算(%)です。回転後の配列を新たに作成することなく、インデックス計算だけで結果を直接出力できるため、追加のメモリ領域を一切必要としません。 入力例と出力例
-
Cプログラムで2次元行列の四隅の要素とその合計を出力する方法
概要 サイズ2×2以上の2次元配列(行列)が与えられたとき、その四隅に格納されているすべての要素を取り出し、合計を求めて出力するのが本記事のテーマです。 四隅の要素とは? 行数「r」、列数「c」(いずれも0から開始)をもつ行列 mat[r][c] を考えると、四隅の要素は次の4つになります。 左上:mat[0][0] 右上:mat[0][c-1] 左下:mat[r-1][0] 右下:mat[r-1][c-1] したがって、求める合計は次の式で表されます。mat[0][0] + mat[0][c-1] + mat[r-1][0] + mat[r-1][c-1]これらの四隅の要素を取得して加算