指针--基础篇

简介: 指针--基础篇

数据在内存中的存储

如果在程序中定义了一个变量,则在对程序进行编译时,系统会为这个变量分配内存单元。内存的基本单元是字节,一个字节有8位,每一个字节都有一个编号,这个编号就是“地址”。

变量的直接访问与间接访问

直接访问:

程序中通过变量名对变量的访问,实际上是通过变量地址、按照变量的数据类型对相应的内存单元进行操作的。通过变量地址可以找到该变量所占的内存单元。因此可以说,变量地址“指向”变量的存储单元

例如:

int a;
float x;
a=872;
x=a+28;

程序中定义了整型变量a和浮点变量x,分别占据不同的内存单元。

假设系统分配4000H和4001H两个字节给变量a,系统给x分配4002H、4003H、4004H、4005H四个字节。则变量a的地址为4000H,变量x的地址为4002H变量地址仅仅是变量在内存中所分配存储空间的低字节的地址。)除此之外,还必须根据变量的数据类型来确定读写操作的方式。故4000H可以理解为是int型数据的地址,4002H可以理解为是float型数据的地址。

在执行“a=872”时,将872按照整型数据的存储方式写入地址4000H所指向的内存单元,即以int型数据写入了4000H和4001H标识的两个字节的内存单元中。

在执行“x=a+28”时,由于运算符的优先性,先计算”a+28“,这时,从地址4000H按照int型数据读出地址4000H和4001H标识的内存单元中的内容872,然后将872+28的运算结果900按照浮点型数据的存储方式写入4002H、4003H、4004H、4005H标识的4个字节的内存单元中。

间接访问

即变量中存放的是另一个变量的地址。按照C语言的规定,可以在程序中定义整型变量、实型变量、字符型变量,也可以定义一种特殊的变量,它是存放地址的。

通过地址能够找到所需要的内存单元。地址“指向”该变量单元。

指针变量里存放的是地址,将这个地址形象地称为**”指针“**

区分:指针与指针变量:指针是指一个地址,而指针变量是一个存放地址的变量。

指针和指针变量

在程序中”*“表示指向,如果定义变量i为指针变量,那么”*i“就表示指针变量i里面所存放的地址所指向的存储单元里面的数据。

指针变量的定义

指针变量定义的一般格式:

基类型*指针变量名

int *i;
float *j;

说明:

  1. "*"指明是指针类型。
  2. 变量名是 i和 j,而不是i和j。
  3. 定义指针变量时必须指明基类型。即int型指针变量i 中只能存放int型变量的地址。float型指针变量j中只能存放float型变量的地址.
  4. int*i表示定义了一个指针变量i,且这个变量中只能存放int型变量的地址,但是并没有对此初始化。即此时的指针变量并未指向任何一个变量。
  5. “指针变量的地址"与"指针变量的内容”:指针变量也是变量,是变量就有地址,所以在运行时系统就会为它分配内存空间,所以这是"指针变量"的地址。而指针变量里又是存放变量的地址的,这个变量的地址称为"指针变量的内容"。

指针变量的初始化

int i;*j;
j=&i;
  1. 在编译时,系统会给变量a和变量j分配内存单元。假设给i分配4000H和4001H两个字节,给j分配4002H和4003H两个字节,则4000H是变量i的地址,4002H是变量j的地址。
  2. 将i的地址放到了变量j中,通过i的地址,j就能找到i中的数据。所以j”指向“了变量i。
  3. 因为j是指针型变量,只能存放地址,所以一定不能忘了取地址符”&“。
  4. “*j” 和"j":定义指针变量时 * 只是一个声明,说明这是一个指针变量。但此时并没有对j这个指针变量初始化。 当指定j指向变量i之后,*j和i就完全等同了,可以相互替换。

“内存单元的地址"与"内存单元的内容”

#include <stdio.h>
int main (void)
{
  int i,*j;  //先定义再初始化
  i=3;
  j=&i;
  printf("%d\n",*j);  //*j表示的是指针变量j中所存放的地址即i的地址所面向的存储单元里的数据即3.
  printf("%d\n",j);  //j中存放的是i的地址
  return 0;
}
3
1703728
#include <stdio.h>
int main (void)
{
  int i=3;
  int *j=&i;  //定义指针变量j并完成初始化
  printf("%d\n",*j);
  printf("%d\n",j);
  return 0;
}
3
1703728

指针变量与指针变量之间的相互赋值

要求:

  1. 两个指针变量的基类型一定要相同
  2. 赋值运算符"="右边的指针指针变量一定是初始化过的。
#include <stdio.h>
int main (void)
{
  int a=1;
  int *i,*k;
  i=&a;   \\给指针变量i初始化
  k=i;    \\将指针变量i的值赋值给指针变量k
  printf("%d\n",i);
  printf("%d\n",k);
  return 0;
}
1703728
1703728


相关文章
|
6月前
|
存储
如何使用指针
如何使用指针。
37 6
|
3月前
|
存储 C语言
指针基础
指针基础
27 0
|
5月前
|
存储 算法 安全
C++一分钟之-数组与指针基础
【6月更文挑战第19天】在C++中,数组和指针是核心概念,数组是连续内存存储相同类型的数据,而指针是存储内存地址的变量。数组名等同于指向其首元素的常量指针。常见问题包括数组越界、尝试改变固定大小数组、不正确的指针算术以及忘记释放动态内存。使用动态分配和智能指针可避免这些问题。示例代码展示了安全访问和管理内存的方法,强调了实践的重要性。
47 3
15.C与指针--超全总结
15.C与指针--超全总结
|
6月前
|
C语言
指针(7)---*和&的区别
指针(7)---*和&的区别
29 0
|
6月前
指针应用基础练习
指针应用基础练习
39 0
|
6月前
|
存储 安全 数据处理
C++系列十一:指针
C++系列十一:指针
指针的基础
指针的基础
47 0
|
程序员 C++
基础:第7章:指针
基础:第7章:指针
51 0
|
存储 编译器 API
数组——参考《C和指针》
数组——参考《C和指针》
46 0