C指针原理
概述
int a = 5;
int * p = &a;
我们应该将int *(C#中指针是int* p,数组是int[] arr)而不是int看作一个整体,*代表指针,而int *就代表int类型的指针。
这段代码的意思是int *类型的指针p被赋给了a的地址,int *称为类型名。
不同场景下*的含义
int * p;
int x = 10;
p = &x;
printf("%d", *p);
printf("%d", p);
除了在声明int *的时候*代表了指针以外,其他时候*都代表解引用运算符。
因此,《C Primer Plus》推荐大家在声明时用int * p(有空格);在使用时用*p(没有空格)
注意:p = &x与*p = x有同样的效果,但是使用*p = x会将值赋给空地址,因此推荐使用p = &x。
指针本身是什么?
p本身代表一个地址,ta的值就是指向&x的地址,在声明且未赋值的的时候为(nil)。
#include <stdio.h>
int main(void)
{
int * p;
int a = 10;
printf("%p\n", p);
printf("%d\n", a);
p = &a;
printf("%p\n", p);
printf("%d", *p);
}
// (nil)
// 10
// 0x7ffe842853ac
// 10⏎
函数指针如何解释?
此指针是指向函数机器码所在位置
语言声明的读法
int (*func_p)(double);
- 先看标识符
int (*func_p)(double);
~~~~~~
- remark: func_p is
- 因为有括号,先看括号内运算符(*)
int (*func_p)(double);
^~~~~~~
- remark: func_p is pointer to
- 再看表示函数的括号,参数是double
int (*func_p)(double);
~~~~~~~~
- remark: func_p is pointer to double returing
- 最后看类型修饰符int
int (*func_p)(double);
~~~
- remark: func_p is pointer to double returing int
func_p是指向返回int的函数(参数是double)的指针。
table:
| C | En | zh |
|---|---|---|
| int hoge; | hoge is array of int | hoge是int |
| int hoge[10]; | hoge is array(with 10 element)of int | hoge是int的数组(元素个数为10) |
| int hoge[10][3]; | hoge is array(with 10 element) of array(with 3 element) of int | hoge是指向int的指针的数组(元素个数为10) |
科学地认识类型
之所以要写一下这里,主要是因为很多人对于类型有这样那样的误解。
基础类型
包括int、float、double、long
派生类型
- 指针
- 数组(以元素的个数为属性)
- 函数(以参数信息为属性)
不完全类型
含义:除函数类型外的长度不确定的类型
- void
其它
可以确定长度的类型被称为对象类型 无法知晓函数的长度,因此没有函数的数组 从函数类型不能派生出指针类型以外的类型 从数组类型不能派生出函数类型 除函数类型、不完全类型,其它类型均有长度