Ngôn ngữ C: kích thước biến con trỏ

các bạn cho mình hỏi trong ngôn ngữ C, kích thước con trỏ là bao nhiêu?

In practice, pointers will be size 2 on a 16-bit system (if you can find one), 4 on a 32-bit system, and 8 on a 64-bit system [from stackoverflow]

2 câu trả lời trên chính xác rồi, bổ sung thêm:
Hệ điều hành 32bit -> 1 ô nhớ 32 bit (cỏn trỏ trỏ vào ô nhớ)

Mình nghĩ là tùy vào trình biên dịch , chứ bản thân ngôn ngữ C nói riêng và ngôn ngữ nói chung chỉ là 1 tập các từ khóa và cú pháp tạo thành ngôn ngữ lập trình và một số hỗ trợ nhất định, vì thế chúng ko quy định trước kích thước ô nhớ. Con trỏ cũng là 1 ô nhớ , trình biên dịch muốn quy định nó là mấy byte thì tùy thôi.

theo như mình tìm hiểu thì nó phụ thuộc vào kiến trúc CPU, OS, trình biên dịch, nhưng hình như quan trọng nhất là kiến trúc CPU thì lại không thấy ai nhắc đến.

Theo mình biết thì sizeof(pointer) = sizeof(int) trên tất cả các system :slight_smile:

[QUOTE=CH1101146;213236]Theo mình biết thì sizeof(pointer) = sizeof(int) trên tất cả các system :)[/QUOTE]

$ cat test.c
#include <stdio.h>
int main(){
printf("sizeof(int*) = %d
sizeof(int) = %d
", sizeof(int*), sizeof(int));
}
$ gcc test.c -o test
test.c: In function ‘main’:
test.c:4:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat]
test.c:4:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘long unsigned int’ [-Wformat]
$ ./test
**sizeof(int*) = 8
sizeof(int) = 4**
$ uname -a
Linux localhost 3.8.13-gentoo #1 SMP Sat May 18 20:30:06 ICT 2013 x86_64 Intel(R) Core(TM) i5-3550 CPU @ 3.30GHz GenuineIntel GNU/Linux
$ gcc -v
Using built-in specs.
COLLECT_GCC=/usr/x86_64-pc-linux-gnu/gcc-bin/4.6.3/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/4.6.3/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /var/tmp/portage/sys-devel/gcc-4.6.3/work/gcc-4.6.3/configure --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/4.6.3 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.6.3 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.6.3/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.6.3/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4 --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-altivec --disable-fixed-point --without-cloog --without-ppl --disable-lto --enable-nls --without-included-gettext --with-system-zlib --enable-obsolete --disable-werror --enable-secureplt --enable-multilib --enable-libmudflap --disable-libssp --enable-libgomp --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/4.6.3/python --enable-checking=release --disable-libgcj --enable-libstdcxx-time --enable-languages=c,c++,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-targets=all --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.6.3 p1.13, pie-0.5.2'
Thread model: posix
gcc version 4.6.3 (Gentoo 4.6.3 p1.13, pie-0.5.2)
$

Chắc bạn chưa biết về system của mình. Câu trả lời ở #2 là đúng rồi.

Kích thước của con trỏ phụ thuộc vào người thiết kế trình biên dịch C chứ không phải do quy định của ngôn ngữ C…

đây là một ví dụ, một con trỏ có kích thước là 3 bytes

http://www.keil.com/support/docs/1012.htm

KeilC là một trình biên dịch cho Vi điều khiển cụ thể là 8051 … cho nên tổ chức bộ nhớ của nó có một chút khác biệt so với các hệ thống mà các bạn ví dụ ở trên

Theo mình nghĩ, người ta sẽ cố gắng chọn kích thước con trỏ sao cho tối ưu về mặt truy xuất bộ nhớ nhất… và kích thước con trỏ bằng với kích thước thanh ghi của hệ thống đích, có lẽ là tối ưu nhất :shy: