浅谈指针

.

一级指针

指针其实就是存放内存地址的变量,其长度在32位系统上固定为4字节。

指针数组

  • 数组的存储内容是指针
    1
    int *p[];

数组指针

  • 指向一个数组的指针
    1
    int (*p)[];

指针函数

  • 函数的返回值类型是一个指针类型
    1
    2
    3
    4
    void *pf();
    /* or */
    typedef void *pf();
    pf function(); // 定义实例

所以指针函数用于修饰函数返回值

函数指针

  • 指向一个函数的指针(函数名 与 &函数名 都表示函数运行的首地址)
    1
    2
    3
    4
    void (*fp)();
    /* or */
    typedef void (*fp)(int ,char);
    fp function; // 定义实例

二重指针

  • 指向一个int*类型的指针
    1
    int **p;
实例意义
int a;&a是一个int *型变量
int *p;指针p指向一个int型变量
int **p;指针p指向一个int *型变量
















int a[3]aaa+1&a&a+1
int 类型数组首元素首地址(int)a + 1sizeof(int), 地址加4byte即a[1]数组首地址(int)a + 1*sizeof(int[3]), 地址加12byte即a[3]

话说大端小端

  • 大端:数据的高字节存储在低地址中
  • 小端:数据的低字节存储在低地址中

代码判断

1
2
3
4
5
6
7
8
9
10
11
union myunion
{
int a;
char b;
};
int BigorSmall()
{
union myunion u1;
u1.a = 1;
return u1.b; // 地址0的那个字节内是1(小端)或者0(大端)
}
1
2
3
4
5
6
char BigorSmall()
{
int a = 1;
char b = *((char *)(&a));
return b;
}

指针都是4字节,为什么还要定义指针类型?

定义指针类型的好处是:定义一个指针时,编译器为指针所指向的内容定义好大小,无需程序员去管理

代码中的变量在内存的情况

计算机的内存地址分配原则:
内存寻址由大到小,优先分配内存地址较大的空间给变量(从下往上),先定义的变量,分配的地址越大

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
int a = 2;
char c = 1;
int *p = &c; // 编译器不会报错,但会有警告,因为指针类型不匹配
printf("%d .\n",*p);
return 0;
}

代码中的变量在内存的情况

  • 指针读取数据是箭头从下往上读取,该代码运行结果为513

:本文内容部分来自互联网整理,部分来自个人经验总结;本文将持续收集更新,欢迎留言补充!

要是觉得不错,就鼓励一下吧!