指针就是地址,地址就是指针
地址就是内存单元的编号
指针变量是存放地址的变量
指针和指针变量是2个不同的概念
#include<stdio.h>
void main()
{
int *p;//定义一个指针
int i;//定义一个变量
i=11110;//初始化变量
p=&i;//取地址
printf("%d",*p);
}
指针的重要性:
指针可以表示一些复杂的数据结构。
图和树的结构,人事管理结构,一个地图有很多城市,经过哪几个站线路的问题,只能用图解决,用指针解决,快速传递数据,把数据发送函数,用指针速度快,是函数返回一个以上的值,一个RETURN返回一个值,能直接访问硬件,内存那一块存储,能够方便的处理字符串
是理解面向对象语言中引用的基础
总结:指针是c语言的灵魂
字符串的处理。
指针的定义:
地址:
内存单元的编号,从0开始的非负整数,
范围:地址范围,内存条决定范围,CPU能直接对内存条操作,内存速度快,越小速度快,东西小,通常大的成本低,大的话就成本高,CPU直接处理内存的数据,内存当做3根线来的,控制线,数据线,地址线。内存分为很多格子,CPU要对内存条进行控制,读数据还是写数据通过控制线来控制的,数据线是用来控制数据的传输,数据传输的方向是由控制线来决定的。地址线是决定单元的。
现在只考虑地址线,内存条,和CPU确定对哪个单元进行控制,存储几个0几个1,一个单元是一个字节,地址总线,一根线只有2中状态,所有的物理设备,控制几个内存单元,一个线最多控制2个状态,2根线控制4个内存单元,然后有n条地址线就有2的n次方个单元。我们的机器是32位的,32个地址线,总共控制2的32次方单元,一个单元为8位。2的32次方就是4G大小, 取决硬件和软件支持的。【0-----4G-1】
字节:就是存储数据的单位,并且是硬件所能访问的最小单位,最小的单位就是1位,但是硬件上不能精确到位只能精确到字节,是8位,硬件访问的最小单位就是字节,1K=1024字节 1M=1024K 1G=1024M 计算机文化课,G和显示的是有差别的,硬盘350G,因为那个的计算是1000为跨度的。机遇,大环境,个人的努力,存储单位要搞清楚,CPU只能控制到字节,
指针:
指针就是地址,
地址就是指针
指针变量就是存放地址的变量
指针和指针变量是2个不同的概念
指针的本质上是一个操作受限的非负整数,可以加减乘除,指针是不允许相加,乘,除,但是可以相减,就是怕超出范围的。指针不能加,乘,除,只能相减。
指针的分类:
1. 基本类型指针
就是刚开始的那个程序,初始化和定义指针,int * 是一个数据类型,只能存放int类型的地址,取地址&I p指向I i是啥,*p就是啥。
指针很容易出错,指针常见错误,
#include<stdio.h>
Int main()
{
Int *p;局部变量没有初始化则里面则为垃圾值,以垃圾值为地址的单元
Int i=5;//将5赋给了一个不知道地址的单元里面、就是不属于你的单元。因为初始化的变量存的是垃圾值,而不在我们规定的地址范围里面。编程最关键的是和内存打交道,如果A运行起来,分配2个单元,不能把其他的地址上数据改了,这样就不行。不属于他的单元进行改写,这样点病毒的特征。
*p=I;
Printf(“%d\n”,*p);
Return 0;
}
Int I =5;
Int *P;
Int *q;
P=&I;
*q=p;类型不一样,不能转换,应该改成,*q=*p;不过这里还是没有初始化的垃圾值。照样错了。
应该改成p=q;但是还是错了,q里面还是垃圾值。如果没有赋值就是垃圾值,有权利对里面内容进行读和写。Q的空间是属于本程序的,所以本程序是可以读写q里面的内容,如果q内部是垃圾值,则本程序不能读写*q的内容。因为*q所代表的内存单元的控制权限并没有分配给本程序。所以就会报错,所以本程序运行到13行时就会立即出错,指针最复杂的错误是内存的泄露和野指针,有个空间,有个p,q,r,都指向该空间,讲指针的目的就是为了动态内存的地址。分配完就要释放,free(p),只释放一次就行了。当程序写的很大了,一个空间可能有很多指针指向他,所以要释放。内存越用越少的。
分配后还是要释放的。指针可以指向一个空间,所以要free.但是又不能多free。Windows开机越用越慢,这是因为有些地方忘了free。指针还是很难的。
Pintf(“%d\n”,*q);
2. 指针和数组的关系
3. 指针和函数的关系
4. 指针和结构体的关系
5. 多级指针
文章评论(0条评论)
登录后参与讨论