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);
  1. 先看标识符
int (*func_p)(double);
      ~~~~~~
  1. 因为有括号,先看括号内运算符(*)
int (*func_p)(double);
     ^~~~~~~
  1. 再看表示函数的括号,参数是double
int (*func_p)(double);
             ~~~~~~~~
  1. 最后看类型修饰符int
int (*func_p)(double);
~~~

func_p是指向返回int的函数(参数是double)的指针。

table:

CEnzh
int hoge;hoge is array of inthoge是int
int hoge[10];hoge is array(with 10 element)of inthoge是int的数组(元素个数为10)
int hoge[10][3];hoge is array(with 10 element) of array(with 3 element) of inthoge是指向int的指针的数组(元素个数为10)

科学地认识类型

之所以要写一下这里,主要是因为很多人对于类型有这样那样的误解。

基础类型

包括int、float、double、long

派生类型

不完全类型

含义:除函数类型外的长度不确定的类型

其它

可以确定长度的类型被称为对象类型 无法知晓函数的长度,因此没有函数的数组 从函数类型不能派生出指针类型以外的类型 从数组类型不能派生出函数类型 除函数类型、不完全类型,其它类型均有长度