初识C语言4--指针
一、指针
1.内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
内存划分的取余大致可以分为 栈区、堆区、静态区
- 栈区中存放局部变量 包括函数的形式参数
- 堆区用来动态内存分配 如malloc calloc realloc free等
- 静态区存放静态变量或者全局变量
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的
内存变量的编号就是地址 地址又叫做指针
编号 == 地址 == 指针
1.个内存单元多大比较合适?
一个字节
2.内存单元的编号怎么产生
地址的产生:32位机器上 有32根地址线,通电是高电平或者低电平 转换成数字信号就是1/0
32根地址线能产生的电信号就有232种
每一个二进制序列就可以作为一个内存单元的编号
所以就可以产生232个地址
一个内存单元是一个字节 一个内存单元给一个地址
那么就能管理232字节的空间
也就是4096MB=4GB的内存空间
int main()
{
int a=10;
向内存申请4个字节的空间 存储10
&a;a实际占用4个字节的空间 每个字节后有地址 但是&a拿到的是它第一个字节的地址(也就是小地址)
int *pa = &a;
pa叫做指针变量
它是一个存放地址的变量 也可以认为是一个存放指针的变量
*说明pa是指针变量
int 说明pa指向的对象是int类型的
*pa=20;//通过解引用改变了a的值 *pa==a 对pa解引用就是a
&叫做取地址操作符
*叫做解引用操作符
return 0;
}
对于 int *pa=&a
可以用下图理解
pa存的是a的地址 而且是a的第一个字节的地址
p指针变量存放的地址指向num
而且是num第一个字节的地址(较小的地址)
对于p解引用就可以访问num
以指针类型为例子 就可以推广到其他类型
#include <stdio.h>
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'q';
printf("%c\n", ch);
return 0;
}
3.指针变量的大小是多大?
指针变量时用来存放地址的 指针变量的大小取决于地址的大小
32位机器上 地址是32个0/1组成的二进制序列 需要32bit位的空间存储 指针变量需要4个字节
64位机器上 地址是64个0/1组成的二进制序列 需要64bit位的空间存储 指针变量需要8个字节
不论是何种类型的指针变量 他们相同位数机器上的大小都是一样的
#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double *));
return 0;
}