知识点一:什么是指针,即指针的定义是什么?
指针(Pointer),是编程语言中的一个对象,通过地址直接指向内存中该地址的值。由于通过地址能找到所需变量的存储单元,可以说地址指向该变量的存储单元,因此可以将地址形象化称为“指针”。总而言之,指针就是变量,存放内存单元的地址,存放在指针中的值都会被当作地址处理。
补充知识:
1.一个内存单元就是一个字节
2.内存的单位:1QB=1024TB 1TB=1024GB 1GB=1024MB 1MB=1024KB 1KB=1024byte 1byte=8bit
#include<stdio.h>
int main()
{
int a=5; //在内存中开辟一块内存空间,存放变量a的值5
int *p=&a; //取出变量a的地址存放在变量p中,p是一个指针变量
// int *p;
//p=&a;
return 0;
}
知识点二 请记住两个操作符:&和*
&取地址操作符,得到的是内存地址【指针用来保存地址,&用来取出地址】
#include <stdio.h>
int main()
{
int a=5;
int *p=&a;
printf("%p\n",&a);
return 0;
}
补充知识:%p是专门用来打印地址的
这里有个小问题:指针变量能存放自己的地址吗
#include <stdio.h>
int main()
{
int a,*a;
a=&a;
return 0;
}
*解引用操作符
#include <stdio.h>
int main()
{
int a = 20;
int *p = &a;
*p=10;
printf("%p\n",p);
printf("%p\n",&a);
printf("%d\n",*p);
printf("%d\n",a);
return 0;
}
分析:
int *p:p是指真变量,定义指针变量需要在相关的数据类型后面加 上*,此处的*并非解引用操作符,仅仅是一种格式。并无实际意义,int则是变量p所指对象的数据类型。
int *p=&a;这一步是取出a的地址(对应&a),并赋值给指针变量p;
*p=10;此处的*是解引用操作符,目的是直接访问p的地址即a,并将阿德大小改成10.
再强调一下此处的*和int*中的*的意义不同,前者是解引用操作符,后者收集一种语法形式,无实际意义。
知识点三:指针变量有多大?
一个指针变量在32为计算机上,占4个字节;
一个指针变量在64位计算机上,占8个字节。
这是为什么呢?我们逐层分析一下?
1,预备知识sizeof()函数
sizeof(数据类型)
返回值就是该数据类型所占的字节数
sizeof(变量名)
返回改变量所占的字节数
#include <stdio.h>
int main()
{
char ch='a';
int i=99;
double x=66.6;
char *p=&ch;
int *q=&i;
double *r=&x;
printf("%d%d%d\n",sizeof(p),sizeof(q),sizeof(r));
return 0;
}
我们通过代码测试发现,指针变量p,q,r所占字节大小 都是8.
2指针变量存放的是什么、
内存中是一个字节一个编号
double类型实战8个字节,也就是说有8个编号
指针变量只保存第一个变量的地址
3.我们知道指针变量所指向的变量占几个字节?
这是由指针变量的类型来决定
如果是int*说明指向的变就占四个字节
我们如果知道了他是int类型的变量,那么就从它保存的地址变量开始向下数4个单元
(一个单元一个字节)
4.为什么指针变量占8个字节呢
p,q,r都只保存了第一个字节的地址也就是他们只占了一个字节的地址,但为什么需要8个字节呢,说明第一个字节的地址(就是一堆编号)通过8个字节去保存
这里我们还需要了解一下计算机组成原理的一些知识
首先,我们要明白,