รบกวนพี่ๆช่วยติว ภาษาซีให้ทีครับ

เริ่มโดย *~เก้าคุง~*, 20 มกราคม 2009, 19:21:03

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

elrarour

[direct=http://www.xn--12cs5aq3bddh4gwbf6a.com]ตามรอยนักชิม[/direct]

Rapture

#21
อ้างถึงจาก: NwnonT ใน 21 มกราคม 2009, 12:44:38
อ้างถึงจาก: ohmohm ใน 21 มกราคม 2009, 01:25:15
อ้างถึงจาก: *~เก้าคุง~* ใน 21 มกราคม 2009, 01:12:01
ถ้า
printf("%p",pt_num); // ค่าที่ได้เป็น address ของ ตัวแปร num

แล้วถ้าอยากรู้ว่าaddress ของพอยเต้อเป็นอะไร จะต้องใช้คำสั่งอะไรเหรอครับ
ไม่รู้จะผ่านหรือเปล่านะครับ &pt_num

ต้องหา gcc มาลงมั่งแล้ว

ถูกแล้วครับ ถ้าต้องการทราบแอดเดรสของตัวแปรก็เอาเครื่องหมาย & ไว้หน้าตัวแปร แล้วแสดงออกมา ไม่ว่าตัวแปรนั้นจะเป็น Pointer อาร์เรย์ หรือว่าตัวแปรธรรมดาก็ตาม

ผมคิดว่า ตามข้างบนนะมั้ง
แต่ถ้าตามข้างบนผมก็ไม่รู้ว่าจะแสดงระหัสควบคุมการแสดงผลเป็นอะไรดี สงสัยว่าจะเป็น %x มั้ง หรือ %p
ซึ่งก็น่าจะได้ตามบรรทัดนี้ >> printf("%x",&pt_num); มั้ง
ส่วน %p เป็นการแสดงผลควบคุมของ pointer ผมไม่แน่ใจว่าถ้า printf("%p",num); แบบนี้จะได้หรือเปล่า
สรุปคือถ้าผมต้องการรู้ตำแหน่งของตัวแปร pt_num
ผมจะทำอย่างนี้
โดยใช้ Indirect pointer ซึี่งก็คือตัวแปร pointer ซ้อน pointer
รูปแบบคือ type **pointer;
โดย type ต้องเป็นชนิดเดียวกับตัวแปร pointer ที่ต้องการหาตำแหน่งที่อยู่ ในที่นี้คือ int
ผมจะเขียนโค้ดใหม่ว่า
#include<stdio.h>
main()
{
int num=100;
int *pt_num; // เป็นการกำหนดว่าตัวแปร pt_num เป็น pointer ชนิดข้อมูลแบบ int
int **ptt_num;//เป็นการกำหนดว่าตัวแปร ptt_num เป็น indirect pointer ชนิดข้อมูลแบบ int
pt_num=&num; // เป็นการให้ค่า ที่อยู่ของ ตัวแปร num ให้กับ ตัวแปร pt_num
ptt_num=&pt_num;// เป็นการให้ค่า ที่อยู่ของ ตัวแปร pt_num ให้กับ ตัวแปร ptt_num
printf("%d",pt_num); // ค่าที่ได้เป็นค่าเดียวกับ num คือ 100ค่าที่ได้คือ address ของ num ในการแสดงผลออกมาในรูปจำนวนเต็ม
printf("%p",pt_num); // ค่าที่ได้เป็น address ของ ตัวแปร num
printf("%p",ptt_num);// ค่าที่ได้เป็น address ของ ตัวแปร pt_num
printf("%p",num); // ค่าที่ได้เป็น address ของ ตัวแปร num เช่นกัน <== ตรงนี้ไม่แน่ใจนะ
}

Hari Seldon

เอ แปลกจัง

ผมลอง compile ด้วย gcc บน CentOS

ได้ผลลัพธ์แบบนี้อ่ะครับ

-1074891484
0xbfee7524
0x64

Rapture

#23
อ้างถึงจาก: Hari Seldon ใน 21 มกราคม 2009, 16:58:43
เอ แปลกจัง

ผมลอง compile ด้วย gcc บน CentOS

ได้ผลลัพธ์แบบนี้อ่ะครับ

-1074891484
0xbfee7524
0x64

ผมว่าไม่แปลกหรอกเพราะพวกผมบอกกันผิดเอง
printf("%d",pt_num); // ค่าที่ได้เป็นค่าเดียวกับ num คือ 100คือ address ของ pt_num num ในการแสดงผลออกมาในรูปจำนวนเต็ม มันเลยแสดงออกมาเป็น -1074891484
ถ้าค่าจะเป็น 100 มันต้องมี *อยู่ด้วยคือ printf("%d",*pt_num);
;D เรื่องมันนานเลยลืม

Hari Seldon

อ้างถึงจาก: Rapture ใน 21 มกราคม 2009, 17:17:20
ถ้าค่าจะเป็น 100 มันต้องมี *อยู่ด้วยคือ printf("%d",*pt_num);

;D

ถ้างั้นก็ง่ายๆ ครับ เรื่อง pointer

โค้ด (c) เลือก
#include<stdio.h>
main()
{
int num=100;
int *pt_num;

pt_num=&num;
printf("*pt_num %d\n",*pt_num);
printf("pt_num  %p\n",pt_num);
printf("num     %p\n",num);
printf("&num    %p\n",&num);
printf("&pt_num %p\n",&pt_num);
}


ผลลัพธ์


*pt_num 100
pt_num  0xbfe9b844
num     0x64
&num    0xbfe9b844
&pt_num 0xbfe9b840


ถ้าเรา declare int *pt_num; มันจะเป็นตัวแปรที่เก็บ address ของ memory
คือ *pt_num จะเหมือนกับ num
และ &num จะเหมือนกับ pt_num

ส่วน %p ใน printf แค่พิมพ์เลขฐาน 16 ของค่าในตัวแปร
ดังนั้น printf("%d", num) ก็เท่ากับ 100 หรือ 0x64

NwnonT

อ้างถึงดังนั้น printf("%d", num) ก็เท่ากับ 100 หรือ 0x64

มันต้องเท่ากับ 100 อย่างเดียวสิครับ %d มันใช้แสดงค่าของเลขฐาน 10 ครับ

Rapture

 ;D ;D ขอสรุปอีกทีแล้วกัน เป็นการรวบรวมข้อมูลทั้งหมด

#include<stdio.h>
main()
{
int num=100;
int *pt_num;

pt_num=&num;
printf("%d",pt_num); //ค่าที่ได้เป็นค่า address ของ num โดยแสดงออกมาในรูปแบบจำนวนเต็ม
printf("%p",pt_num); //ค่าที่ได้เป็นค่า address ของ num โดยแสดงออกมาในรูปแบบเลขฐาน 16
printf("%p",num); // ค่าที่ได้เป็นค่าของ num โดยแสดงออกมาในรูปแบบเลขฐาน 16 นั่นคือค่า 100 ในรูป 0x64
}

ohmohm

#27
อ้างถึงจาก: Hari Seldon ใน 21 มกราคม 2009, 16:58:43
เอ แปลกจัง

ผมลอง compile ด้วย gcc บน CentOS

ได้ผลลัพธ์แบบนี้อ่ะครับ

-1074891484
0xbfee7524
0x64


0xbfee7524 ก็คือ -1074891484 นั้นเอง ( 2's compliment )

พึ่งนึกได้ มี OpenBSD อยู่ใกล้ เดี๋ยวลองมั่งดีกว่า

[ตอบ] ได้แล้ว
-809658176
0xcfbd98c0
0x64

moneysever

ประกาศค่า  num  เรียน  num มาใช้    ผมก็ไม่แน่ใจ 

มันมี  ตัวแปล อยุ่อัน  เอามาเพิ่ม ได้คับ

เดียวไว้จะลองไปเปิดหนังสือดูมาให้ครับ

Hari Seldon

อ้างถึงจาก: NwnonT ใน 21 มกราคม 2009, 17:48:35
อ้างถึงดังนั้น printf("%d", num) ก็เท่ากับ 100 หรือ 0x64

มันต้องเท่ากับ 100 อย่างเดียวสิครับ %d มันใช้แสดงค่าของเลขฐาน 10 ครับ

อ่า ครับ ผมเขียนไม่ชัดเจน หมายถึงค่ามันเท่ากันครับ 0x64 คือฐานสิบหกของ 100 ฐานสิบ
คือมันจะแสดง 0x64 สำหรับ printf( "%p", num ); หรือ printf( "%p", *pt_num );