คือว่าผมเรียนเรื่องพอยน์เตอร์อยู่ครับ มึนกับชีสอาจารย์มากๆเลยมาดูโค้ดกันดีกว่า คือว่าผมไม่เข้าใจว่า คำสั่งไหนใช้แสดงอะไร ใช้แสดง address ของตัวแปรที่ชี้ไป หรือตัวพอยน์เตอร์เองอ่ะครับ
#include<stdio.h>
main()
{
int num=100;
int *pt_num;
pt_num=#
printf("%d",pt_num); <<<< ค่าที่แสดงออกมาคืออะไรครับ address ของตัวแปร num หรือป่าว?
printf("%p",pt_num); <<<< มันจะแสดง address ของ pt_test หรือตัวแปร num ครับ
printf("%p",num); <<<< คำสั่งนี้ใช้แสดง address ของ num ใช่หรือป่าวครับ
}
ไม่ค่อยแน่ใจนะครับ ผมก็เพิ่งปี 1 เอง
บรรทัดแรกจะแสดงค่า address ของ num ครับ ออกมาในรูปเลขฐาน 10 เพราะ %d มันจะแสดงออกมาในรูปฐาน 10 ครับ
บรรทัดที่สองจะแสดงค่า address ของ num ครับ แต่จะออกมาในรูปเลขฐาน 16
บรรทัดที่สาม num ไม่ใช่ตัวแปร pointer เราจะเอามาใช้ไม่ได้ครับ แต่มันจะคอมไพล์ผ่าน แต่ที่ออกมาคือค่าของ num ในรูปของเลขฐาน 16 แทน
ยังงัยรอท่านอื่นมาตรวจครับ
*pt_num=#
printf("%d",pt_num); 100
printf("%p",pt_num) น่าจะ add จ๊ะ
printf("%p",num); ไม่รู้ว่าใช้ %p ได้ป่าว เพราะ มันไม่ใช่ pointer เห็นกำหนดมัน ไม่มี *
pt_num=# ทำไมไม่ใส่ *pt_num=# อ่ะ pt_num เป้นพ้อยเตอร์ไม่ใช่นิ
ไม่รู้นะ อยากรู้ ลองรันดู เก้าเอ้ย จุ๊บๆ มี่ก้อเรียนซียังไม่ผ่านเลย 555+
อ้างถึงทำไมไม่ใส่ *pt_num=# อ่ะ pt_num เป้นพ้อยเตอร์ไม่ใช่นิ
pt_num มัันคือ pointer อยู่แล้วนะครับ ค่าที่จะใส่ให้มัน ควรเป็น address ซึ่งก็คือ &num
อ้างถึงจาก: ohmohm ใน 20 มกราคม 2009, 22:16:10
อ้างถึงทำไมไม่ใส่ *pt_num=# อ่ะ pt_num เป้นพ้อยเตอร์ไม่ใช่นิ
pt_num มัันคือ pointer อยู่แล้วนะครับ ค่าที่จะใส่ให้มัน ควรเป็น address ซึ่งก็คือ &num
ป่าว หมายถึง ทำไมไม่ใส่ * ข้างหน้า pt_num ในตัวอย่างที่เก้าจังให้มาเห็นไม่ใส่ เลยสงสัย ตกลงว่าไม่ต้องใส่เหรอ ???
อืม มี่ก้อไม่รู้แฮะ เรียนมาปุ๊บก้อคืนอาจานปั๊บเลย โหะๆ
อ้างถึงจาก: หมวยแว๊น ใน 20 มกราคม 2009, 22:34:26
อ้างถึงจาก: ohmohm ใน 20 มกราคม 2009, 22:16:10
อ้างถึงทำไมไม่ใส่ *pt_num=# อ่ะ pt_num เป้นพ้อยเตอร์ไม่ใช่นิ
pt_num มัันคือ pointer อยู่แล้วนะครับ ค่าที่จะใส่ให้มัน ควรเป็น address ซึ่งก็คือ &num
ป่าว หมายถึง ทำไมไม่ใส่ * ข้างหน้า pt_num ในตัวอย่างที่เก้าจังให้มาเห็นไม่ใส่ เลยสงสัย ตกลงว่าไม่ต้องใส่เหรอ ???
อืม มี่ก้อไม่รู้แฮะ เรียนมาปุ๊บก้อคืนอาจานปั๊บเลย โหะๆ
แบบว่ามี่เข้าใจว่า
printf("%d",pt_num) อันนี้มันก็จะเอาค่า pt_num มาแสดง เป็น int
ส่วน %p อ่ะ มะเคยใช้มี่เลยดำน้ำ + ลองถามเพื่อนดู เค้าก้อว่าน่าจาแสดง ที่อยู่ของตัวแปรที่กำหนดที่อยู่ข้างหลังนั่นน่ะ
ก้อเลยเดาว่า printf("%p",pt_num) ถ้าเขียนอย่างที่เขียนมาอ่ะ มันจะแสดงค่า ของ pt_num เพราะงั้นก็น่าแสดงจะ adddress ของ pt_num
printf("%p",num); นี่ก้อน่าจะใช้แสดง address ของ num
แต่เห็น เก้าไม่ใส่ * ข้างหน้าตัวแปรที่กำหนดให้เป็นพ้อยเตอร์ เลยสงสัยว่ามันจะรันผ่านนิ
ถ้าใส่ * อ่ะ ตัวแปรที่อยู่หลังสัญลักษณ์ * จะเป็นตัวแปรชนิด พอยน์เตอร์ แต่ถ้าไม่มี * มันก็แค่ตัวแปร int ธรรมดาไม่ใช่เหรอ
หรือไงอ่ะ อธิบายมี่หน่อยนะ มี่เริ่มสับสนกับตัวเองละ
#include<stdio.h>
main()
{
int num=100; กำหนด num=100 เป็นแบบ interger
int *pt_num; กำหนด pt_num เป็น interger (*ไม่แน่ใจว่าทำอะไร)(ที่ผมคิดไว้บรรทัดนี้น่าจะเป็น int pt_num;)
pt_num=# ให้ pt_num=num <== ตัวนี้จะเป็นตัวเก็บพอยเตอร์
printf("%d",pt_num); <<<< แสดงค่าของ pt_num ในรูปแบบของ %d
printf("%p",pt_num); <<<< แสดงค่าของ pt_num ในรูปแบบของ %p
printf("%p",num); <<<< แสดงค่าของ num ในรูปแบบของ %p
พวก %d,%p ผมจำไม่ได้แล้วว่าแสดงเป็นจำนวนเต็มหรือทศนิยมกันแน่ดูเองนะ
ปล.ถ้าเปลี่ยนวิธีเขียนได้ใช้ พวก cin กับ cout (อ่าน ซีอิน ซีเอาท์) ดีกว่าการแสดงผลไม่ต้องใช้พวก %d
อ้างถึงจาก: kkusd ใน 20 มกราคม 2009, 23:03:33
#include<stdio.h>
main()
{
int num=100; กำหนด num=100 เป็นแบบ interger
int *pt_num; กำหนด pt_num เป็น interger (*ไม่แน่ใจว่าทำอะไร)(ที่ผมคิดไว้บรรทัดนี้น่าจะเป็น int pt_num;)
pt_num=# ให้ pt_num=num <== ตัวนี้จะเป็นตัวเก็บพอยเตอร์
printf("%d",pt_num); <<<< แสดงค่าของ pt_num ในรูปแบบของ %d
printf("%p",pt_num); <<<< แสดงค่าของ pt_num ในรูปแบบของ %p
printf("%p",num); <<<< แสดงค่าของ num ในรูปแบบของ %p
พวก %d,%p ผมจำไม่ได้แล้วว่าแสดงเป็นจำนวนเต็มหรือทศนิยมกันแน่ดูเองนะ
ปล.ถ้าเปลี่ยนวิธีเขียนได้ใช้ พวก cin กับ cout (อ่าน ซีอิน ซีเอาท์) ดีกว่าการแสดงผลไม่ต้องใช้พวก %d
pt_num มันคือ pointer อยู่แล้วนะครับ ค่าที่จะใส่ให้มัน ควรเป็น address ซึ่งก็คือ &numกำลัง งง ว่า pt_num มานจาเปนพ้อยเตอร์ได้ไง ถ้าไม่มี * อยู่ข้างหน้า มานกะจะเป็นแค่ชื่อตัวแปรธรรมดา ที่เก็บค่าตามชนิดข้อมูลที่เรากำหนดง่ะ
เข้าใจว่า *pt_num=# เนี่ย ไอ้ pt_num คือ ตัวแปรที่เป้นพอยน์เตอร์ ส่วน num คือ ชื่อตัวแปรที่ต้องการกำหนดค่า addressให้
ส่วน %d เก็บค่า int ค่ะ ในรูปจำนวนเต็ม ถ้าเป็นทศนิยม จะเป็น %f ค่ะ
กำ ตกลงว่า
printf("%p",pt_num);
มันแสดง address ของอะไรกันแน่ตัวที่มันชี้ หรือตัวมันเอง ผมล่ะงง -_-" ดันมี ๒ ความเห็นอีก
มี่ครับมันไม่ต้องใส่ * อยู่แล้วครับ เพราะว่าเราใส่ไว้ตอนกำหนดค่าตัวแปรแล้ว ว่ามันเป็นพอยเตอร์ไม่ใช่ตัวแปรธรรมดา ดังนั้นเวลาเอามาใช้มันจึงไม่ต้องใส่ดอกจัน
อ้างถึงจาก: *~เก้าคุง~* ใน 20 มกราคม 2009, 23:13:59
กำ ตกลงว่า
printf("%p",pt_num);
มันแสดง address ของอะไรกันแน่ตัวที่มันชี้ หรือตัวมันเอง ผมล่ะงง -_-" ดันมี ๒ ความเห็นอีก
มี่ครับมันไม่ต้องใส่ * อยู่แล้วครับ เพราะว่าเราใส่ไว้ตอนกำหนดค่าตัวแปรแล้ว ว่ามันเป็นพอยเตอร์ไม่ใช่ตัวแปรธรรมดา ดังนั้นเวลาเอามาใช้มันจึงไม่ต้องใส่ดอกจัน
จุ๊บๆ ก้อแค่เนี๊ยแหละ ที่อยากได้ แหม๋ ให้รอซะนาน ว่าแต่ เก้า ทำไมได้มาเรียนซีล่ะ - -*
#include<stdio.h>
main()
{
int num=100;
int *pt_num; // เป็นการกำหนดว่าตัวแปร pt_num เป็น pointer ชนิดข้อมูลแบบ int
pt_num=# // เป็นการให้ค่า ที่อยู่ของ ตัวแปร num ให้กับ ตัวแปร pt_num
printf("%d",pt_num); // ค่าที่ได้เป็นค่าเดียวกับ num คือ 100ค่าที่ได้คือ address ของ num ในการแสดงผลออกมาในรูปจำนวนเต็ม
printf("%p",pt_num); // ค่าที่ได้เป็น address ของ ตัวแปร num
printf("%p",num); // ค่าที่ได้เป็น address ของ ตัวแปร num เช่นกัน <== ตรงนี้ไม่แน่ใจนะ
}
pt_num=# กำหนดค่า address แรกของตัวแปร num ไปเก็บไว้ที่พอยน์เตอร์ pt_num
เพราะงั้น ไอ้ printf("%p",pt_num); ก้อต้อง แสดงค่า address ของตัวแปร num มั้งนะ ???
ถูกป่ะ ถ้าผิด มาบอกด้วยนะ มี่จาได้ไปคิดอีก แหะๆ ไม่ได้จับมาเป็นชาติแระภาษาซี จะได้ทบทวนไปด้วย เง้อ
printf("%d",*pt_num);
อันนี้ได้ 100 นะครับ (มาทำให้งงเข้าไปอีก 555+)
กะลังเรียน พ้อยเตอร์เหมือนกาน งง ดี
ทำไมไม่ใช้ คอมไพล์ รันเองเรยอ่ะ
จาก
#include<stdio.h>
main()
{
int num=100;
int *pt_num;
pt_num=#
printf("%d",pt_num); <<<< ค่าที่แสดงออกมาคืออะไรครับ address ของตัวแปร num หรือป่าว?
printf("%p",pt_num); <<<< มันจะแสดง address ของ pt_test หรือตัวแปร num ครับ
printf("%p",num); <<<< คำสั่งนี้ใช้แสดง address ของ num ใช่หรือป่าวครับ
}
ก็เป็น
printf("%d %p,num,num);
printf("%d %p,&num,&num); << ให้ค่า address ของ num ออกมา(%p แตกต่างกับ %x นิดเดียวตรงเลข 00 ข้างหน้า(อันไหนซักอันเนี่ยแหละ))
printf("%d %p,pt_num,pt_num);
printf("%d %p,*pt_num,*pt_num);
ไม่รู้นะ เวลาผมอยกรู้อะไร ก้ รันๆๆๆ มันไปเรย 555+
ตอนนี้ กะลัง งง ว่า เอา พ้อยตเอร์มาทำไรหว่า ใช้งงก่า array อีก
:'(
อ้างถึงpt_num มานจาเปนพ้อยเตอร์ได้ไง ถ้าไม่มี *
ความจริงมันมี * ครับ แต่อยู่ตรงที่ declare ( int * pt_num )
ไม่ได้เขียน C นานแล้วเหมือนกัน แต่เวลาเขียน สำำหรับเราเราจะมองว่า int และ pointer ใดใด ( รวมทั้งตัวครอบจักรวาล void * ) เป็นตัวแปรแบบ 32-bit อาจเก็บ value หรือ address ก็ได้
ทบทวนความรู้
http://home.netcom.com/~tjensen/ptr/pointers.htm
ถ้า
printf("%p",pt_num); // ค่าที่ได้เป็น address ของ ตัวแปร num
แล้วถ้าอยากรู้ว่าaddress ของพอยเต้อเป็นอะไร จะต้องใช้คำสั่งอะไรเหรอครับ
อ้างถึงจาก: *~เก้าคุง~* ใน 21 มกราคม 2009, 01:12:01
ถ้า
printf("%p",pt_num); // ค่าที่ได้เป็น address ของ ตัวแปร num
แล้วถ้าอยากรู้ว่าaddress ของพอยเต้อเป็นอะไร จะต้องใช้คำสั่งอะไรเหรอครับ
ไม่รู้จะผ่านหรือเปล่านะครับ &pt_num
ต้องหา gcc มาลงมั่งแล้ว
อ้างถึงจาก: ohmohm ใน 21 มกราคม 2009, 01:25:15
อ้างถึงจาก: *~เก้าคุง~* ใน 21 มกราคม 2009, 01:12:01
ถ้า
printf("%p",pt_num); // ค่าที่ได้เป็น address ของ ตัวแปร num
แล้วถ้าอยากรู้ว่าaddress ของพอยเต้อเป็นอะไร จะต้องใช้คำสั่งอะไรเหรอครับ
ไม่รู้จะผ่านหรือเปล่านะครับ &pt_num
ต้องหา gcc มาลงมั่งแล้ว
ถูกแล้วครับ ถ้าต้องการทราบแอดเดรสของตัวแปรก็เอาเครื่องหมาย & ไว้หน้าตัวแปร แล้วแสดงออกมา ไม่ว่าตัวแปรนั้นจะเป็น Pointer อาร์เรย์ หรือว่าตัวแปรธรรมดาก็ตาม
วันหลัง มี่เอาการบ้านมาให้พี่ๆสอนมั่งนะ อิอิ :-[
อ้างถึงจาก: ohmohm ใน 21 มกราคม 2009, 00:55:45
อ้างถึงpt_num มานจาเปนพ้อยเตอร์ได้ไง ถ้าไม่มี *
ความจริงมันมี * ครับ แต่อยู่ตรงที่ declare ( int * pt_num )
ไม่ได้เขียน C นานแล้วเหมือนกัน แต่เวลาเขียน สำำหรับเราเราจะมองว่า int และ pointer ใดใด ( รวมทั้งตัวครอบจักรวาล void * ) เป็นตัวแปรแบบ 32-bit อาจเก็บ value หรือ address ก็ได้
ทบทวนความรู้
http://home.netcom.com/~tjensen/ptr/pointers.htm
ขอบคุณมากค่ะ มี่ก้อไม่ได้จับภาษา c มานานแล้ว ก็ลืมไปเหมือนกัน เลยสับสนนิดๆว่าใช้ยังไง ขอบคุณมากสำหรับความรู้ค่ะ
มาดูเทพคุยกัน ผมงงไปหมดเลย ???
อ้างถึงจาก: EThaiZone ใน 21 มกราคม 2009, 14:32:43
มาดูเทพคุยกัน ผมงงไปหมดเลย ???
โจเซฟิเน่ อย่ามาทำแอ๊บไม่รู้เรื่องนะ อย่าง EThaiZone เนี่ยนะจะไม่รู้เรื่อง
มางงอีกคน :P
อ้างถึงจาก: 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 ให้กับ ตัวแปร 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 เช่นกัน <== ตรงนี้ไม่แน่ใจนะ
}
เอ แปลกจัง
ผมลอง compile ด้วย gcc บน CentOS
ได้ผลลัพธ์แบบนี้อ่ะครับ
-1074891484
0xbfee7524
0x64
อ้างถึงจาก: 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 เรื่องมันนานเลยลืม
อ้างถึงจาก: Rapture ใน 21 มกราคม 2009, 17:17:20
ถ้าค่าจะเป็น 100 มันต้องมี *อยู่ด้วยคือ printf("%d",*pt_num);
;D
ถ้างั้นก็ง่ายๆ ครับ เรื่อง pointer
#include<stdio.h>
main()
{
int num=100;
int *pt_num;
pt_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
อ้างถึงดังนั้น printf("%d", num) ก็เท่ากับ 100 หรือ 0x64
มันต้องเท่ากับ 100 อย่างเดียวสิครับ %d มันใช้แสดงค่าของเลขฐาน 10 ครับ
;D ;D ขอสรุปอีกทีแล้วกัน เป็นการรวบรวมข้อมูลทั้งหมด
#include<stdio.h>
main()
{
int num=100;
int *pt_num;
pt_num=#
printf("%d",pt_num); //ค่าที่ได้เป็นค่า address ของ num โดยแสดงออกมาในรูปแบบจำนวนเต็ม
printf("%p",pt_num); //ค่าที่ได้เป็นค่า address ของ num โดยแสดงออกมาในรูปแบบเลขฐาน 16
printf("%p",num); // ค่าที่ได้เป็นค่าของ num โดยแสดงออกมาในรูปแบบเลขฐาน 16 นั่นคือค่า 100 ในรูป 0x64
}
อ้างถึงจาก: Hari Seldon ใน 21 มกราคม 2009, 16:58:43
เอ แปลกจัง
ผมลอง compile ด้วย gcc บน CentOS
ได้ผลลัพธ์แบบนี้อ่ะครับ
-1074891484
0xbfee7524
0x64
0xbfee7524 ก็คือ -1074891484 นั้นเอง ( 2's compliment )
พึ่งนึกได้ มี OpenBSD อยู่ใกล้ เดี๋ยวลองมั่งดีกว่า
[ตอบ] ได้แล้ว
-809658176
0xcfbd98c0
0x64
ประกาศค่า num เรียน num มาใช้ ผมก็ไม่แน่ใจ
มันมี ตัวแปล อยุ่อัน เอามาเพิ่ม ได้คับ
เดียวไว้จะลองไปเปิดหนังสือดูมาให้ครับ
อ้างถึงจาก: NwnonT ใน 21 มกราคม 2009, 17:48:35
อ้างถึงดังนั้น printf("%d", num) ก็เท่ากับ 100 หรือ 0x64
มันต้องเท่ากับ 100 อย่างเดียวสิครับ %d มันใช้แสดงค่าของเลขฐาน 10 ครับ
อ่า ครับ ผมเขียนไม่ชัดเจน หมายถึงค่ามันเท่ากันครับ 0x64 คือฐานสิบหกของ 100 ฐานสิบ
คือมันจะแสดง 0x64 สำหรับ printf( "%p", num ); หรือ printf( "%p", *pt_num );