ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingรบกวนพี่ๆช่วยติว ภาษาซีให้ทีครับ
หน้า: 1 [2]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: รบกวนพี่ๆช่วยติว ภาษาซีให้ทีครับ  (อ่าน 4093 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
elrarour
ก๊วนเสียว
*

พลังน้ำใจ: 6
ออฟไลน์ ออฟไลน์

กระทู้: 316



ดูรายละเอียด เว็บไซต์
« ตอบ #20 เมื่อ: 21 มกราคม 2009, 15:57:33 »

มางงอีกคน  Tongue
บันทึกการเข้า

Rapture
สมุนแก๊งเสียว
*

พลังน้ำใจ: 116
ออฟไลน์ ออฟไลน์

กระทู้: 639



ดูรายละเอียด
« ตอบ #21 เมื่อ: 21 มกราคม 2009, 16:33:33 »

ถ้า
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 เช่นกัน <== ตรงนี้ไม่แน่ใจนะ
}
« แก้ไขครั้งสุดท้าย: 21 มกราคม 2009, 17:25:52 โดย Rapture » บันทึกการเข้า
Hari Seldon
ก๊วนเสียว
*

พลังน้ำใจ: 16
ออฟไลน์ ออฟไลน์

กระทู้: 258



ดูรายละเอียด
« ตอบ #22 เมื่อ: 21 มกราคม 2009, 16:58:43 »

เอ แปลกจัง

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

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

โค๊ด:
-1074891484
0xbfee7524
0x64
บันทึกการเข้า
Rapture
สมุนแก๊งเสียว
*

พลังน้ำใจ: 116
ออฟไลน์ ออฟไลน์

กระทู้: 639



ดูรายละเอียด
« ตอบ #23 เมื่อ: 21 มกราคม 2009, 17:17:20 »

เอ แปลกจัง

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

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

โค๊ด:
-1074891484
0xbfee7524
0x64
ผมว่าไม่แปลกหรอกเพราะพวกผมบอกกันผิดเอง
printf("%d",pt_num); // ค่าที่ได้เป็นค่าเดียวกับ num คือ 100คือ address ของ pt_num num ในการแสดงผลออกมาในรูปจำนวนเต็ม มันเลยแสดงออกมาเป็น -1074891484
ถ้าค่าจะเป็น 100 มันต้องมี *อยู่ด้วยคือ printf("%d",*pt_num);
 Grin เรื่องมันนานเลยลืม
« แก้ไขครั้งสุดท้าย: 21 มกราคม 2009, 17:19:23 โดย Rapture » บันทึกการเข้า
Hari Seldon
ก๊วนเสียว
*

พลังน้ำใจ: 16
ออฟไลน์ ออฟไลน์

กระทู้: 258



ดูรายละเอียด
« ตอบ #24 เมื่อ: 21 มกราคม 2009, 17:31:40 »

ถ้าค่าจะเป็น 100 มันต้องมี *อยู่ด้วยคือ printf("%d",*pt_num);

 Grin

ถ้างั้นก็ง่ายๆ ครับ เรื่อง 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
สมุนแก๊งเสียว
*

พลังน้ำใจ: 39
ออฟไลน์ ออฟไลน์

กระทู้: 634



ดูรายละเอียด เว็บไซต์
« ตอบ #25 เมื่อ: 21 มกราคม 2009, 17:48:35 »

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

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

Rapture
สมุนแก๊งเสียว
*

พลังน้ำใจ: 116
ออฟไลน์ ออฟไลน์

กระทู้: 639



ดูรายละเอียด
« ตอบ #26 เมื่อ: 21 มกราคม 2009, 17:57:29 »

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

#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
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 170
ออฟไลน์ ออฟไลน์

กระทู้: 3,098



ดูรายละเอียด เว็บไซต์
« ตอบ #27 เมื่อ: 21 มกราคม 2009, 18:41:04 »

เอ แปลกจัง

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

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

โค๊ด:
-1074891484
0xbfee7524
0x64

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

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

[ตอบ] ได้แล้ว
โค๊ด:
-809658176
0xcfbd98c0
0x64
« แก้ไขครั้งสุดท้าย: 21 มกราคม 2009, 21:49:20 โดย ohmohm » บันทึกการเข้า
moneysever
สมุนแก๊งเสียว
*

พลังน้ำใจ: 38
ออฟไลน์ ออฟไลน์

กระทู้: 815



ดูรายละเอียด
« ตอบ #28 เมื่อ: 22 มกราคม 2009, 11:25:30 »

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

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

เดียวไว้จะลองไปเปิดหนังสือดูมาให้ครับ
บันทึกการเข้า
Hari Seldon
ก๊วนเสียว
*

พลังน้ำใจ: 16
ออฟไลน์ ออฟไลน์

กระทู้: 258



ดูรายละเอียด
« ตอบ #29 เมื่อ: 22 มกราคม 2009, 11:43:51 »

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

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

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