c语言指针的使用,指针的基本用法
- 开发语言
- 2023-08-29
- 80
老铁们,大家好,相信还有很多朋友对于c语言指针的使用和指针的基本用法的相关问题不太懂,没关系,今天就由我来为大家分享分享c语言指针的使用以及指针的基本用法的问题,文章篇...
老铁们,大家好,相信还有很多朋友对于c语言指针的使用和指针的基本用法的相关问题不太懂,没关系,今天就由我来为大家分享分享c语言指针的使用以及指针的基本用法的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
c语言指针是什么意思
C语言指针是一种特殊的变量类型,它存储了一个变量的内存地址。通过指针,可以直接访问和修改该内存地址上存储的数据。指针可以用来实现对变量的间接访问,使得程序能够更灵活地操作内存中的数据。
在C语言中,可以使用指针来进行动态内存分配、传递函数参数、操作数组等。通过指针,可以避免在函数调用时进行大量的数据拷贝,提高程序的执行效率。同时,指针也需要注意使用的安全性,避免出现野指针、空指针等问题。
指针的声明和使用需要注意语法规则,包括使用星号(*)来声明指针变量,使用取地址符(&)获取变量的地址,使用星号(*)来访问指针所指向的变量等。正确理解和使用指针是C语言程序设计中的重要内容。
C语言指针到底有什么用
所有变量值保存在内存中,而每个内存都有一个地址,所谓地址就是一个整数编号,如同门牌号码用于定位(专业术语叫寻址),一个地址对应一个字节(8bit)的内存单元。
如今的编译器,一个整数int类型的值占用32位bit,也就是4字节,编译器将第一个字节的编号定义为该整数的地址,由于保存地址的变量就像一个箭头指向某地址,而称为指针变量。
inta=10;//定义一个整数变量a,对其赋值10
int*p=&a;//定义一个指针变量p,对其赋值a的内存地址,&符号意思为引用跟随其后的变量地址。
cont<<a<<end;//输出a的值:10
cont<<p<<end;//输出p的值:XXXXX其实为a的地址,该地址由编译器和运行时确定。
cont<<*p<<end;//输出p指向的地址中的值:10,也就是a的值,*星号放在变量前面意思就是取该变量中的地址所指内存中的值。
读取过程为:p的值(a的地址)->寻址->取值
由于指针是一个变量的首个字节的地址,所以要告诉编译器被指地址包含连续多少个字节,因此指针也有类型。比如上面例子中声明了p指针是个整数指针,这样编译器知道p指向一个4字节的内存块。
你可以将指针变量看做一般的整数变量来理解,用来保存一个整数(地址是个整数),只是,该整数代表着某地址,在这里是a的地址。
在C/C++中很灵活,但是也很危险,也很难学,如果指针指向错误的地址会引起程序崩溃,因此在C#中已经被微软封装了,但内部还是有指针的。
如果有必要,C#中也可以使用指针,使用非安全代码,在项目生成选项卡中勾选“允许非安全代码”,然后就可以使用指针了,不过不建议这么做。
unsafe
{
inta=10;
int*p=&a;
}
怎样熟练掌握C语言的指针
C语言指针就是这门语言的灵魂,说难学,那肯定是有难度的,毕竟这是业界公认的。但是如果你熟练掌握了指针的话,它又将会成为你手中的一柄利器。下面就详细的分享一下指针该如何深入的去理解它以及如何熟练的应用它
理解指针首先,你需要掌握两个运算符“*”和“&”;
“&”运算符:取对象在内存中的地址
“*”运算符:取内存中地址上的对象(值);
大家一定要深刻的理解上面两个运算符,然后才能去进一步理解指针;
inta=100;这一行代码我想大家都没问题。那么“&a”返回的就是对象(变量)a在内存中的地址,它是一个16进制数。
然后用“*”号去a的地址去取对象:“*(&a)”,,就能取到对象a,也就就是100;
接下来进入重点了,指针,本身也是一个变量(对象),它本身占用内存,但是它只存地址(别人的地址),它存的谁的地址我们就称它为指向谁的指针;
int*p=&a;int*p_2=newint(200);先不管他的类型申明,只看变量本身p和p_2。前面讲到指针存放的是对象的地址,那么可以理解为指针是一个地址变量,那么赋值的话就需要也赋一个地址给它一个地址。int*和char*都可以表示地址类型,它们的区别就是地址所存的值得类型不同,一个是存整型,一个是存字符型;
对指针取值的话,就是用“*”号,后面接对象地址,也就是指针变量,所以*p和*p_2就分别是a和200;
指针的运用指针并不是C/C++独有的,像C#和java等其实也是有指针的,只不过都被语言本身用其他的方式替代和封装了一般程序员接触不到,C/C++就不一样,它是直接将指针暴露给开发者,因为大部分牵涉到指针的都与内存有关,而计算机内存很重要,万一出什么问题可能系统都会崩溃,下面就简单来看一下程序在运行时指针与内存之间到底是个什么样的关系:
先看一段代码:
#include<stdio.h>
#include<string>
#include<iostream>
#include<time.h>
usingnamespacestd;
classpeople
{
public:
people();
~people();
stringName;
intage;
boolsex;
charinfo[1024];
voidrun(){}
voideat(){}
private:
};
people::people()
{
}
people::~people()
{
}
intmain()
{
people*p1=newpeople();
cout<<p1<<endl;
cout<<&p1<<endl;
cout<<sizeof(p1)<<endl;
cout<<sizeof(*p1)<<endl;
system("pause");
return0;
}
直接运行看结果:
分析接下来来一一进行分析:
首先people*p1=newpeople();这一句是类的一个实例化,系统会给people实例化一个对象*p并且给它在堆上开辟空间,注意是在堆上,开辟的空间用来存储对象的数据。数据包括哪些?就是对象的属性和虚函数指针,但是函数并不存储在各对象中。因此run()和eat()方法是不存在对象*p指向的内存处的。
cout<<p1<<endl;输出的是00279360,这是一个地址,是系统给newpeople()对象分配的地址。
cout<<&p1<<endl;输出的是0012FD90,这也是地址,但这是指针变量p本身的地址。
cout<<sizeof(p1)<<endl;
cout<<sizeof(*p1)<<endl;
通过这两个输出就能有更清晰的认识了,p1本身只占用4个字节的空间,而它所指向的对象的地址所占的空间就很大,等于类中所有数据类型所占空间之和。
接下来在main函数里写一点逻辑:
图解我们来看一下程序运行时间,指针和内存是怎么工作的。这里画一个图给大家:
程序在运行时,数据主要是存储在栈、堆、代码区、全局区。代码区主要就是存代码中出现的一些字符常量、方法等,比如这里代码中给对象的Name属性赋的值“xiaoli”之类的都是存在此处,然后我们通过new出来的对象,都是由堆通过计算好类中各属性所需空间然后开辟出来的。这里p3不是通过new开辟出来的,所以他是存在栈上的并且地址是固定的,是不能更改的,而p1和p2是能更改的。
改变地址
如此,我们三个对象互相赋值后会发生什么呢?
对比代码和输出结果我们发现了什么?赋值后p1和p2本身的地址并无改变,但是他所指向的内存都编程p3所在的内存了。下面用图解给大家看一下:
注意,此处原来的p1和p2指向的内存由于是new出来的我们需要手动释放它。所以我们在重新赋值之前要将这两块内存删除掉deletep2;deletep1;
改变地址的值
如果我将代码中的p2=&p3;换成*p2=p3呢?我们看下输出结果:
造成这种情况的原因,其实这就牵涉到指针的两种赋值问题:一种是改变指向的地址,一种是改变本身指向地址的值p2=&p3是改变指向地址,*p2=p3是改变指向地址的值。
c语言什么时候需要使用指针
啥时候都可以
一般我们在编程的时候,经常使用变量替代我们解决问题的一些量,在程序中也就直接用变量操作,这也很好理解,但是,由于某些机制,不能让出现变量这种明文信息,那就要用隐含的方式操作了,这时候提出来指针变量,指针操作的不是直接的值,而是空间,那这样,从变量你可能直接得到值,而用指针你并不能直接得到值,即使得到,你也不知道这个值表示啥意思。
c语言指针的应用
C语言中的指针的作用是:通过指针不仅可以对数据本身,还可以对存储数据的变量地址进行操作。指针就是内存地址,指针变量是用来存放内存地址的变量。指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。
c语言指针详细讲解
C语言中指针是一种数据类型,指针是存放数据的内存单元地址。
计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节,为了便于管理,必须为每个存储单元编号,该编号就是存储单元的“地址”,每个存储单元拥有一个唯一的地址。
指针变量除了可以存放变量的地址外,还可以存放其他数据的地址,例如可以存放数组和函数的地址。
关于本次c语言指针的使用和指针的基本用法的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。
本文链接:http://xinin56.com/kaifa/12058.html