我有关于指针的问题;一个理论和一个实践。
为什么在C语句中声明指针时,必须在* var前加上一个类型。如果指针只是一个包含内存地址的变量,为什么编译器/语言需要的信息比指针更多。 int *和char *之间有什么区别?这是否意味着int *指向包含2-4个字节内存且char *仅包含1的某个位置?我从来没有读过关于为什么类型重要的基本推理的任何内容,如果最终它是一个指向某个十六进制数的变量作为%p打印它们的证据。
其次,鉴于此代码
int t = 10;
int *i = &t;
int *j = i;
--
*i == 10;
*j == 10;
为什么* j等于10而不是** j为10?如果j是指向i的指针,它是一个指向t的指针,那么我不需要对变量j进行双重解引用吗?在xcode中编写此代码时,它强制我使用* j。
所以这些是我用指针混淆的一些例子。
答案 0 :(得分:3)
需要数据类型才能知道取消引用指针时要读取的字节数。
int *i = &t;
此处,i
中存储的值是t
的地址。
int *j = i;
现在,j
中存储的值是存储在i
中的值,即t
的地址。如果您想进行双重引用,则需要存储i
的地址。
int **j = &i
答案 1 :(得分:2)
为什么编译器/语言需要的信息比指针
更多
仅使用指针,编译器不会。类型void*
表示“指向任何东西的指针”。
但是,要使用指向的值,编译器需要知道所指向的内容的类型,以便它知道可以用它做什么。取消引用void*
将导致编译器错误,除非您首先将其强制转换为类型指针。
其次,鉴于此代码
j
不是指向i
的指针。作业int *j = i;
将j
设置为与i
相同的值,这是[{1}}的地址(因此t
现在指向j
)。
要使t
成为指向j
的指针,您需要将其声明为i
答案 2 :(得分:0)
为什么编译器/语言需要的信息比指针更多。
这是因为不同的数据类型具有不同的大小,并且需要大小的数据类型来分配内存。
int *和char *之间有什么区别?
int *
是指向int
的指针,char *
是指向char
的指针。
为什么* j等于10而不是** j为10?如果j是指向i的指针,它是一个指向t的指针,那么我不需要对变量j进行双重解引用吗?
int *j = i;
告诉编译器将j
声明为int
的指针,并将此指针指向指针i
所指向的内存位置。因此j
是指向变量t
的指针。
答案 3 :(得分:0)
C是一种静态类型语言。还有其他语言,例如JavaScript,它们是动态类型的,您可以将不同类型的对象分配给同一个变量。
这两种方法都有其优点和缺点,静态类型语言最重要的优点是可以在编译时捕获许多错误。
这是一项设计决定。