Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++における%pと%xの違いを解説!ポインタと16進数の出力の使い分け

CやC++のプログラミングにおいて、printf関数で使用できる書式指定子「%p」と「%x」には、それぞれ異なる役割があります。この記事では、両者の違いについて具体例を交えながら詳しく解説します。

%pと%xの基本的な違い

「%p」は主にポインタ(メモリアドレス)の値を出力するために使用される書式指定子です。一方、「%x」は値を16進数形式で出力するためのものです。

なお、ポインタの値は「%u」(符号なし10進数)や「%x」を使って表示することも技術的には可能ですが、処理系によっては正しく表示されない場合があります。そのため、ポインタを扱う際には「%p」を使用することが推奨されています。

実行例

実際に同じ値を%pと%xで出力してみると、一見すると大きな違いには気づかないかもしれません。唯一確認できる違いは、%pが出力時に先頭に0(ゼロ)を付加するのに対し、%xでは先頭の0が付かないという点です。

#include<stdio.h>
main() {
    int x = 59;
    printf("Value using %%p: %p\n", x);
    printf("Value using %%x: %x\n", x);
}

出力結果

Value using %p: 000000000000003B
Value using %x: 3b

このように、59(16進数では3B)を出力した場合、%pでは「000000000000003B」と先頭が0で埋められた形式で表示されますが、%xでは単に「3b」と表示されます。

まとめ

%pはポインタのアドレス表示用、%xは16進数表示用というのが本来の用途です。移植性を考慮してポインタを出力する場合は%pを、通常の整数値を16進数で表示したい場合は%xを、目的に応じて使い分けるとよいでしょう。

  1. C/C++における #include <filename> と #include "filename" の違い

    C/C++のプリプロセッサディレクティブである #include には、ヘッダファイルを指定する2つの記法があります。これらの根本的な違いは、プリプロセッサがファイルを探す場所(検索パス)にあります。 #include <filename>(角括弧) システム標準のヘッダファイルをインクルードする際に使用します。 プリプロセッサは、コンパイラがあらかじめ指定しているシステムインクルードディレクトリ(例: /usr/include、Visual StudioのVC/includeなど)を検索します。 検索順序やディレクトリの場所は実装(コンパイラ/環境)依存です。 主

  2. 【C/C++】const int* と int* const の違いを徹底解説!宣言の読み方のコツも紹介

    はじめに:constとポインタの組み合わせ C/C++では、「const」と「ポインタ」を組み合わせた宣言が複数存在し、それぞれ意味が異なるため、初心者がつまずきやすいポイントの一つです。この記事では、代表的な4つのパターンを整理し、何が変更できて何が変更できないのかを具体例とともに解説します。 4つの基本パターン int* // intへのポインタ int const * // constなintへのポインタ int * const // intへのconstポインタ int const * const // con