2

私はポインターの学習の初心者です。これが私のコードです。(注:私はまだポインタを理解しようとしているので、私のコードはきれいではありません。)

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]){

int a = 1;
char b = 's';
double c = 3.14;
int *ptra;
int *ptrb;
int *ptrc;

ptra = &a;
ptrb = &b;
ptrc = &c;

printf("I initialised int as %d and char as %c and double as %.2f\n", a, b, c);
printf("The address of A is %p and the contents of A is %d\n", ptra, *ptra);
printf("The address of B is %p and the contents of B is %c\n", ptrb, *ptrb);
printf("The address of C is %p and the contents of C is %.2f\n", ptrc, *ptrc);

次の出力が期待されていました。

I initialised int as 1 and char as s and double as 3.14
The address of A is 0xbf933094 and the contents of A is 1
The address of B is 0xbf933093 and the contents of B is s
The address of C is 0xbf933098 and the contents of C is 3.14

しかし、代わりに私はこれを取得します:

I initialised int as 1 and char as s and double as 3.14
The address of A is 0xbf933094 and the contents of A is 1
The address of B is 0xbf933093 and the contents of B is s
The address of C is 0xbf933098 and the contents of C is 427698.00000

Cの内容を印刷するときに得た多数を誰かが助けることができますか? 3.14 を取得できないのはなぜですか? (数字は実際にはそれよりも長いですが、このテキスト ボックスに収まりませんでした。:-))

4

7 に答える 7

0

ここで、ポインター ptrc は、データ型が整数の変数のアドレスを参照していますが、double に使用しています。

于 2013-06-24T06:53:07.787 に答える
0

型付きポインターについて少しだけ言えばいいのですが。

型を持つポインター (ポインターとは対照的にvoid*) は、メモリ内で進むべきバイト数を認識しています。たとえば、32 ビット システムでは、整数値を含む配列を反復処理するときに、整数ポインターは通常、メモリ内で 4 バイト進みます。

char ポインター (C 標準では常に 1 バイトであることが保証されています) は、自然に一度に 1 バイトずつ進みます。

これを小さなコード スニペットで説明しましょう。

#include <stdio.h>

int main()
{
    char array [] = "This is a char array.";

    int* int_ptr;

    char* char_ptr;

    char_ptr = array; /* This is okay, we have a char array and we assign its address to a char pointer */

    int_ptr = array; /* It will complain but let's go along with it */

    printf("%p, %p, %p\n", array, char_ptr, int_ptr); /* They should all point to the same address in memory */

    printf("%p\n", ++char_ptr); /* it will have advanced by one byte */

    printf("%p\n", ++int_ptr); /* it will have advance by four bytes */    

    return 0;
}

私のマシンには次の出力があります。

$ ./a.out 
0xbf8b85d2, 0xbf8b85d2, 0xbf8b85d2
0xbf8b85d3
0xbf8b85d6

ご覧のとおり、彼らは私たちが予測したとおりに前進しています。ポインターの逆参照を開始し、それらが基になる型と一致しない場合、これがあらゆる種類の問題を引き起こす可能性があることは明らかです。

void*ポインターに関しては、それらの算術は違法です。

于 2013-06-24T03:07:40.473 に答える