关于C指针的两个问题

时间:2015-10-31 20:24:15

标签: c pointers

我有关于指针的问题;一个理论和一个实践。

为什么在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。

所以这些是我用指针混淆的一些例子。

4 个答案:

答案 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,它们是动态类型的,您可以将不同类型的对象分配给同一个变量。

这两种方法都有其优点和缺点,静态类型语言最重要的优点是可以在编译时捕获许多错误。

这是一项设计决定。