当日のOHP資料です。
10.ポインター( Text p.226 - 245 )
Download : sample-001.c ( SJIS 版 )
#include <stdio.h> void char_pointer_calc ( void ) { char cv; printf ( "char 型:\n" ); printf ( "\tsizeof(char) == %d\n", sizeof( char ) ); printf ( "\tchar cv;\n" ); printf ( "\t&cv == %p\n", &cv ); printf ( "\t&cv + 1 == %p\n", &cv + 1 ); printf ( "\t&cv + 2 == %p\n", &cv + 2 ); printf ( "\t((char *)0x10000) == %p\n", ((char *)0x10000) ); printf ( "\t((char *)0x10000) + 1 == %p\n", ((char *)0x10000) + 1 ); printf ( "\t((char *)0x10000) + 2 == %p\n", ((char *)0x10000) + 2 ); printf ( "\t((char *)%p) - ((char *)%p) == %d\n", ((char *)(0x10000 + 8)), ((char *)(0x10000)), ((char *)(0x10000 + 8)) - ((char *)(0x10000)) ); printf ( "\n" ); } void int_pointer_calc ( void ) { int iv; printf ( "int 型:\n" ); printf ( "\tsizeof(int) == %d\n", sizeof( int ) ); printf ( "\tint iv;\n" ); printf ( "\t&iv == %p\n", &iv ); printf ( "\t&iv + 1 == %p\n", &iv + 1 ); printf ( "\t&iv + 2 == %p\n", &iv + 2 ); printf ( "\t((int *)0x10000) == %p\n", ((int *)0x10000) ); printf ( "\t((int *)0x10000) + 1 == %p\n", ((int *)0x10000) + 1 ); printf ( "\t((int *)0x10000) + 2 == %p\n", ((int *)0x10000) + 2 ); printf ( "\t((int *)%p) - ((int *)%p) == %d\n", ((int *)(0x10000 + 8)), ((int *)(0x10000)), ((int *)(0x10000 + 8)) - ((int *)(0x10000)) ); printf ( "\n" ); } void double_pointer_calc ( void ) { double dv; printf ( "double 型:\n" ); printf ( "\tsizeof(double) == %d\n", sizeof( double ) ); printf ( "\tdouble dv;\n" ); printf ( "\t&dv == %p\n", &dv ); printf ( "\t&dv + 1 == %p\n", &dv + 1 ); printf ( "\t&dv + 2 == %p\n", &dv + 2 ); printf ( "\t((double *)0x10000) == %p\n", ((double *)0x10000) ); printf ( "\t((double *)0x10000) + 1 == %p\n", ((double *)0x10000) + 1 ); printf ( "\t((double *)0x10000) + 2 == %p\n", ((double *)0x10000) + 2 ); printf ( "\t((double *)%p) - ((double *)%p) == %d\n", ((double *)(0x10000 + 8)), ((double *)(0x10000)), ((double *)(0x10000 + 8)) - ((double *)(0x10000)) ); printf ( "\n" ); } int main ( void ) { printf ( "\t\tpointer calculation\n" ); char_pointer_calc(); int_pointer_calc(); double_pointer_calc(); return 0; }
C:\usr\c\> sample-001 pointer calculation char 型: sizeof(char) == 1 char cv; &cv == 0xbff0e5df &cv + 1 == 0xbff0e5e0 &cv + 2 == 0xbff0e5e1 ((char *)0x10000) == 0x10000 ((char *)0x10000) + 1 == 0x10001 ((char *)0x10000) + 2 == 0x10002 ((char *)0x10008) - ((char *)0x10000) == 8 int 型: sizeof(int) == 4 int iv; &iv == 0xbff0e5dc &iv + 1 == 0xbff0e5e0 &iv + 2 == 0xbff0e5e4 ((int *)0x10000) == 0x10000 ((int *)0x10000) + 1 == 0x10004 ((int *)0x10000) + 2 == 0x10008 ((int *)0x10008) - ((int *)0x10000) == 2 double 型: sizeof(double) == 8 double dv; &dv == 0xbff0e5d8 &dv + 1 == 0xbff0e5e0 &dv + 2 == 0xbff0e5e8 ((double *)0x10000) == 0x10000 ((double *)0x10000) + 1 == 0x10008 ((double *)0x10000) + 2 == 0x10010 ((double *)0x10008) - ((double *)0x10000) == 1 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
#include <stdio.h> int main ( void ) { double dv; printf ( "sizeof(double)=%d\n", sizeof(double) ); printf ( "&dv == %p\n", &dv ); printf ( "&dv + 1 == %p\n", &dv + 1 ); printf ( "&dv + 2 == %p\n", &dv + 2 ); printf ( "sizeof(int)=%d\n", sizeof(int) ); printf ( "((int *)&dv) == %p\n", (int *)&dv ); printf ( "((int *)&dv) + 1 == %p\n", ((int *)&dv) + 1 ); printf ( "((int *)&dv) + 2 == %p\n", ((int *)&dv) + 2 ); printf ( "sizeof(char)=%d\n", sizeof(char) ); printf ( "((char *)&dv) == %p\n", (char *)&dv ); printf ( "((char *)&dv) + 1 == %p\n", ((char *)&dv) + 1 ); printf ( "((char *)&dv) + 2 == %p\n", ((char *)&dv) + 2 ); return 0; }
C:\usr\c\> sample-002 sizeof(double)=8 &dv == 0xbfbfc808 &dv + 1 == 0xbfbfc810 &dv + 2 == 0xbfbfc818 sizeof(int)=4 ((int *)&dv) == 0xbfbfc808 ((int *)&dv) + 1 == 0xbfbfc80c ((int *)&dv) + 2 == 0xbfbfc810 sizeof(char)=1 ((char *)&dv) == 0xbfbfc808 ((char *)&dv) + 1 == 0xbfbfc809 ((char *)&dv) + 2 == 0xbfbfc80a C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
#include <stdio.h> int main ( void ) { int iv = 0x12345678; printf ( "iv == %x\n", iv ); printf ( "&iv == %p\n", &iv ); printf ( "*(&iv) == %x\n", *(&iv) ); printf ( "(char *)&iv == %p\n", (char *)&iv ); printf ( "*((char *)(&iv)) == %x\n", *((char *)(&iv)) ); printf ( "((char *)&iv + 1) == %p\n", ((char *)&iv) + 1 ); printf ( "*((char *)(&iv) + 1) == %x\n", *(((char *)(&iv)) + 1) ); printf ( "((char *)&iv + 2) == %p\n", ((char *)&iv) + 2 ); printf ( "*((char *)(&iv) + 2) == %x\n", *(((char *)(&iv)) + 2) ); printf ( "((char *)&iv + 3) == %p\n", ((char *)&iv) + 3 ); printf ( "*((char *)(&iv) + 3) == %x\n", *(((char *)(&iv)) + 3) ); printf ( "\n" ); /* */ printf ( "iv == %x\n", iv ); printf ( "*((char *)&iv) = 0\n" ); *((char *)&iv) = 0; printf ( "iv == %x\n", iv ); /* */ iv = 300; printf ( "iv == %d\n", iv ); printf ( "*((char *)&iv) = 0;\n" ); *((char *)&iv) = 0; printf ( "iv == %d\n", iv ); /* */ return 0; }
C:\usr\c\> sample-003 iv == 12345678 &iv == 0xbffe2bfc *(&iv) == 12345678 (char *)&iv == 0xbffe2bfc *((char *)(&iv)) == 78 ((char *)&iv + 1) == 0xbffe2bfd *((char *)(&iv) + 1) == 56 ((char *)&iv + 2) == 0xbffe2bfe *((char *)(&iv) + 2) == 34 ((char *)&iv + 3) == 0xbffe2bff *((char *)(&iv) + 3) == 12 iv == 12345678 *((char *)&iv) = 0 iv == 12345600 iv == 300 *((char *)&iv) = 0; iv == 256 C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
#include <stdio.h> int main ( void ) { int iv; int *ip; ip = &iv; printf ( "&iv == %p\n", &iv ); printf ( "ip == %p\n", ip ); iv = 100; printf ( "iv == %d\n", iv ); printf ( "*ip == %d\n", *ip ); *ip = 200; printf ( "iv == %d\n", iv ); printf ( "*ip == %d\n", *ip ); return 0; }
C:\usr\c\> sample-004 &iv == 0xbfd9967c ip == 0xbfd9967c iv == 100 *ip == 100 iv == 200 *ip == 200 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
#include <stdio.h> void sub ( int arg ) { printf ( "sub:\n" ); printf ( "\targ == %d\n", arg ); printf ( "\t&arg == %p\n", &arg ); arg = arg * 10; printf ( "\targ == %d\n", arg ); } int func ( int arg ) { printf ( "func:\n" ); printf ( "\targ == %d\n", arg ); printf ( "\t&arg == %p\n", &arg ); arg = arg * 10; printf ( "\targ == %d\n", arg ); return arg; } int main ( void ) { int iv = 5; printf ( "&iv == %p\n", &iv ); printf ( "iv == %d\n", iv ); sub ( iv ); printf ( "iv == %d\n", iv ); iv = func ( iv ); printf ( "iv == %d\n", iv ); return 0; }
C:\usr\c\> sample-005 &iv == 0xbf941cdc iv == 5 sub: arg == 5 &arg == 0xbf941cc0 arg == 50 iv == 5 func: arg == 5 &arg == 0xbf941cc0 arg == 50 iv == 50 C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
#include <stdio.h> void without_pointer( int arg ) { printf ( "without pointer:\n" ); printf ( "\targ == %d\n", arg ); arg = arg * 10; printf ( "\targ == %d\n", arg ); } void with_pointer( int *argp ) { printf ( "with pointer:\n" ); printf ( "\t*argp == %d\n", *argp ); *argp = *argp * 10; printf ( "\t*argp == %d\n", *argp ); } int main ( void ) { int iv = 5; printf ( "iv == %d\n", iv ); without_pointer( iv ); printf ( "iv == %d\n", iv ); with_pointer( &iv ); printf ( "iv == %d\n", iv ); return 0; }
C:\usr\c\> sample-006 iv == 5 without pointer: arg == 5 arg == 50 iv == 5 with pointer: *argp == 5 *argp == 50 iv == 50 C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
#include <stdio.h> void my_char_scanf ( char *cp ) { printf ( "Input char : " ); scanf ( "%c", cp ); } void my_int_scanf ( int *ip ) { printf ( "Input int : " ); scanf ( "%d", ip ); } void my_double_scanf ( double *dp ) { printf ( "Input double : " ); scanf ( "%lf", dp ); } int main ( void ) { char cv; int iv; double dv; my_char_scanf ( &cv ); printf ( "Input char is %c\n", cv ); my_int_scanf ( &iv ); printf ( "Input int is %d\n", iv ); my_double_scanf ( &dv ); printf ( "Input double is %f\n", dv ); return 0; }
x 12 3.14
C:\usr\c\> sample-007 Input char : x Input char is x Input int : 12 Input int is 12 Input double : 3.140000 Input double is 3.140000 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
#include <stdio.h> int main ( void ) { int iv; /* */ printf ( "Pointer\n" ); iv = 0x12345678; printf ( "Before: iv == %x\n", iv ); *((char *)&iv) = '0'; printf ( "After: iv == %x\n", iv ); printf ( "\n" ); /* */ printf ( "Scanf\n" ); iv = 0x12345678; printf ( "Before: iv == %x\n", iv ); printf ( "Please input '0' then [ENTER] : \n" ); scanf ( "%c", &iv ); printf ( "After: iv == %x\n", iv ); /* */ return 0; }
0
C:\usr\c\> sample-008 Pointer Before: iv == 12345678 After: iv == 12345630 Scanf Before: iv == 12345678 Please input '0' then [ENTER] : 0 After: iv == 12345630 C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
#include <stdio.h> int main ( void ) { int ia[10]; printf ( "ia == %p\n", ia ); printf ( "&ia[0] == %p\n", &ia[0] ); return 0; }
C:\usr\c\> sample-009 ia == 0xbfd82da8 &ia[0] == 0xbfd82da8 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
#include <stdio.h> int main ( void ) { int ia[10]; int *ip; /* */ ip = ia; /* ip = &a[0] と同じ */ /* */ ia[0] = 123; printf ( "*ip == %d\n", *ip ); /* ip == &a[0] より *ip == *&a[0] == ia[0] */ printf ( "*ia == %d\n", *ia ); /* ia == &a[0] より *ia == *&a[0] == ia[0] */ /* */ ia[1] = 456; printf ( "ip[1] == %d\n", ip[1] ); /* ip[1] == ia[1] */ /* */ *(ip + 3) = 789; /* *(ip+3) == ip[3] == ia[3] */ printf ( "ia[3] == %d\n", ia[3] ); /* */ printf ( "3[ip] == %d\n", 3[ip] ); /* はぁ ? */ /* 3[ip] == *(3 + ip) */ /* == *(ip + 3) */ /* == ip[3] */ /* */ printf ( "*(ip+10) == %d\n", *(ip+10) ); /* ポインターの危い利用法 */ printf ( "ia[10] == %d\n", ia[10] ); /* 配列だって同じく危い */ /* */ return 0; }
C:\usr\c\> sample-010 *ip == 123 *ia == 123 ip[1] == 456 ia[3] == 789 3[ip] == 789 *(ip+10) == -1077009228 ia[10] == -1077009228 C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
#include <stdio.h> int main ( void ) { char line[10] = "abcdefg"; scanf ( "%s", line + 3 ); /* "xy" と入力すると.. */ printf ( "%s\n", line ); /* "abcxy" と後の部分だけが上書きされる */ printf ( "line[6]=%c\n", line[6] ); /* 'g' はまだ、残っている */ return 0; }
xy
C:\usr\c\> sample-011 xy abcxy line[6]=g C:\usr\c\>
Download : sample-012.c ( SJIS 版 )
#include <stdio.h> int main ( void ) { char line[10]; /* scanf */ scanf ( "%9s", line ); /* 入力文字数を指定 */ printf ( "「%s」\n", line ); /* 指定した文字数だけ入力した */ scanf ( "%9s", line ); printf ( "「%s」\n", line ); /* 残りの文字は改行の直前まで後から読み取れる */ /* 改行が残っている */ getchar(); /* 改行を読み飛ばす */ /* fgets */ fgets ( line, 9, stdin ); /* 指定した文字数だけ入力 */ printf ( "「%s」\n", line ); fgets ( line, 9, stdin ); /* 残りの文字は、改行も読み込まれる */ printf ( "「%s」\n", line ); return 0; }
abcdefghijklmn abcdefghijklmn
C:\usr\c\> sample-012 abcdefghi 「abcdefghi」 jklmn 「jklmn」 「abcdefgh」 「ijklmn 」 C:\usr\c\>
Download : sample-013.c ( SJIS 版 )
#include <stdio.h> #define EOS '\0' void add_123_with_pointer ( int *ptr ) { *ptr++ = 1; *ptr++ = 2; *ptr++ = 3; } #define ENOGH_SIZE 100 int main ( void ) { int ia[ENOGH_SIZE]; int *ip; for ( ip = ia; ip < ia + ENOGH_SIZE - 3; ip = ip + 3 ) { add_123_with_pointer ( ip ); } *ip = 0; for ( ip = ia; *ip > 0; ip++ ) { printf ( "%d\n", *ip ); } return 0; }
C:\usr\c\> sample-013 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 C:\usr\c\>
Download : sample-014.c ( SJIS 版 )
#include <stdio.h> void add_123_without_pointer ( int ia[], int start ) { ia[start++] = 1; ia[start++] = 2; ia[start++] = 3; } #define ENOGH_SIZE 100 int main ( void ) { int ia[ENOGH_SIZE]; int ii; for ( ii = 0; ii < ENOGH_SIZE - 3; ii = ii + 3 ) { add_123_without_pointer ( ia, ii ); } ia[ii] = 0; for ( ii = 9; ia[ii] > 0; ii++ ) { printf ( "%d\n", ia[ii] ); } return 0; }
C:\usr\c\> sample-014 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 C:\usr\c\>
#include<stdio.h> int main() { int va = 10; int *ip = &va; char *cp = (char *)&va; printf ( "ip=%p\n", ip ); printf ( "ip + 1 = %p\n", ip + 1 ); printf ( "cp=%p\n", cp ); printf ( "cp + 1 = %p\n", cp + 1 ); va = 300; printf ( "va = %d\n", va ); *ip = 0; printf ( "va = %d\n", va ); va = 300; printf ( "va = %d\n", va ); *cp = 0; printf ( "va = %d\n", va ); }