问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言中指针怎么使用?176

发布网友 发布时间:2023-10-13 17:27

我来回答

5个回答

热心网友 时间:2024-12-02 23:41

1、使用场景

使用指针时,必须将它指向一个变量的地址或者为它分配空间方能使用,如下所示:

#include<stdio.h>

#include <stdlib.h>

int main(int argc, char const *argv[])

{

int a[5]={0,1,2,3,4};

int *b,*d;

int c=2;

int *e=a; //e指向a数组首地址

//*b=2;   无法直接初始化

//printf("%d\n", *b);

e=e+2;  //移动两个地址单元

d=&c;  //d指向c的地址来表示值

c=4;   //修改原c变量的值,d指针的值会发生改变

b=(int *)malloc(sizeof(int));//为b分配一个int型空间来直接存储值

*b=2;//分配空间后可以直接赋值了

printf("this is e,b,c,d :%d %d %d %d\n",*e,*b,c,*d);

2、类型说明

(1)int *a :表示一个指向int型变量的指针,指向的是变量的地址单元

(2)char *b:表示一个指向char变量的指针

*a表示的是这个指针指向地址的值,a为此指针本身的地址,这点要明确,一般用*(a+1)、*(a+2)来表示值,如:

int nums[5]={0,1,2,3,4};

int *a=nums;

printf("%d %d %p\n",*a,*(a+1),a);

扩展资料:

指针的运算

指针指向变量地址,若原变量的内容发生了变化,它本身也会发生变化,指针之间的运算一般为值运算和地址运算

(1)值运算:直接通过*运算方式,像a+*(a+1),结果为第一个元素与第二个元素相加。

int nums[5]={0,1,2,3,4};

int *a=nums;

(2)地址运算:通过a+i的方式.指针会指向a的下i个地址。

int nums[5]={0,1,2,3,4};

int *a=nums;

a=a+2;

printf("%d\n",*a);

结果输出2。 

参考资料来源 :指针-百度百科

热心网友 时间:2024-12-02 23:42

1、指针指向变量:

下面有这样一个代码块:

int  main()

{int a=10;int b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}

void test(int  x,int y)

{int tmp;tmp=x;x=y;y=tmp;}

最后输出的结果还是a=10,b=15。

因为在函数调用时,实参和形参之间只是值传递。

但我们使用指针结果就不一样了,如:

int  main()

{int a=10;int b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;}

void test(int * x,int *y)

{int tmp;tmp=*x;*x=*y;*y=tmp;}

输出结果a=15,b=10。变量a和b的值发生了交换。

这是因为我们利用指针访问变量的存储单元,间接修改变量的值。

2、指针指向数组:

定义一个数组并初始化,int array[5]={2,5,12,7,8},定义一个指针变量并把数组的地址赋给它,int *p=array,注意数组名就是数组的地址,而且数组的地址就是首元素的地址。

因此我们的指针变量就指向了数组的首元素,*p=2。如果把(p+1),那么指针变量就指向了数组的下一个元素5,因此我们可以利用指针来遍历数组的各个元素:

int  main()

{int array[5]={2,5,12,7,8};int *p =array;for(int i=0;i<5;i++){printf("array[%d]=%d\n",i,*(p+i));}return 0;}

3、指针指向字符串:

我们都知道用数组存储字符串,如char name[20]="jack",上面已经简单讲述了指针指向数组,所以我们可以这样做,char *name="jack",指针变量指向字符串的首个字符并可以依次访问字符串的各个字符。

4、指针指向函数:

我们需要知道怎样表示一个指针指向函数,说白了就是语法要正确,下面我也取一个代码块来说明一下:

int sum(int x,int y)

{return x+y;}

int main()

{int a=5;int b=6;int (*p)(int,int);p=sum;int result=(*p)(a,b);printf("The result is %d\n",result);return 0;}

不难发现上面代码块里语句(*p)(a,b)可以用p(a,b)来代替,因为p和sum就是一样的,只是用前者可能更容易理解一点。

而我们要知道怎样定义一个指针指向函数,int (*p)(int,int)这是固定写法,前面的int是指针将来指向的函数的返回值的类型,如果没有函数返回值,那就是void,后面括号里的两个int当然就是指针将指向的函数的形参。

5、指针指向结构体:

我们首先首先定义一个结构类型,

struct student

{     char *name;

int  ages;};

再根据类型定义结构体变量struct student stu={"Rose",15};

定义一个指针指向结构体类型,struct student *p;把结构体变量stu的地址赋给指针变量p,p=&stu;

我们可以有3种方式来访问结构体中的属性ages:stu.ages=15;(*p).ages=15;p->ages=15;不过第三种方式在C语言中只能用来指向结构体。

扩展资料:

指针的用途非常广泛,比如如果你想通过函数改变一个变量的值,就得用指针而不能用值传递。还有在很多时候变量,特别是对象的数据量实在太大,程序员就会用指针来做形参,只需要传递一个地址就行,大大提高了效率。简单地说指针就是指向变量和对象的地址。

基本说明:

1、在计算机中,所有的数据都是存放在存储器中的。 一般把存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等;

2、为了正确地访问这些内存单元,须为每个内存单元编上号。 根据一个内存单元的编号即可准确地找到该内存单元。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。内存单元的指针和内存单元的内容是两个不同的概念。

参考资料:百度百科-指针

热心网友 时间:2024-12-02 23:42

我是这样理解的:
在C语言中,你需要定义变量,那么你所定义的这个变量本身你要理解两层含义:
(1)变量中的值是多少?有了值我们可以直接拿变量参与运算,eg. int a=5;在计算的时候a就表示5;
(2)变量存储在内存中的什么位置?变量的存储位置,就是变量的地址,那么这个地址可以用指针来存储,eg. int a=5, *p=&a; 在这里p就是指针变量,存储了变量a的地址,这个时候你要是用a变量的值,即可以直接用a,也可以用*p,*p是通过p这个指针(也就是a的地址),间接的找到a,在程序中*p与a是等价的。追问那么*p,**p,***p有什么区别?

追答*p,**p,***p分别叫做一级指针、二级指针和*指针。
如果这样定义: int a,*p,**q,***r;
第一个 *p 中的p 用来存放普通变量的地址,例如赋值: p=&a;
第二个**q中的q,你可以这样理解 用来存放地址 的地址,虽然有点绕,你可以体会一下,比如上一个p,它是指针型变量,这个变量的值是变量a的地址,那么p这个变量存在哪,它的地址在哪呢?这个时候就需要一个比p高一层的指针来存放p变量的地址,因此可以这样赋值 q=&p
第三个***r,道理同上,可以这样赋值 r=&q
你看看是不是能容易理解!

热心网友 时间:2024-12-02 23:43

指针可以理解为地址即指向地址的指针,在使用之前要明确三个问题,指针的类型,指针指向的类型,指针指向值的内存区域。通过传递值的地址来传递值

热心网友 时间:2024-12-02 23:43

指针是指向地址的,所以你对指针修改也会影响到原地址的值,所以当你需要在函数里修改函数外的变量时可以考虑指针,当然指针还可以连接结构体里的节点之类的,后面还有跟函数有关的,只要多揣摩就会了解了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么药止痒效果好 慕容三藏履历 职业cf电脑配置cf电脑配置要求是什么 玩3a电脑配置要求想玩3a大作需要什么配置 台式电脑哪些可以畅享3a大作想玩3a大作需要什么配置 七彩虹i7-10700台式机 性能强劲 高效静音 小黄鱼游戏台式电脑主机(i7-10700F、16GB、512GB、RTX3070)-适用... 工伤保险记什么科目 在4×4的正方形格纸中,有一个以格点为顶点的△ABC,请你找到点C,使三角... 在4×4方格中, 要求C点在格点上,且以AB为边的△ABC为直角三角形,标出所... 被P过的照片如何还原131 摩托车油箱摔倒油漆掉了一块怎么补? 模拟人生2 怎么建墙。1 CAD中如何设置图层我要步骤?6 中国历史上笔画最多的字46 模仿视频出事故,办公室小野方赔偿,法理和人道主义到底哪个重要... 女子穿汉服与穿和服韩服的一个区别在首饰 广州白云山路线谁可以推荐一条,包括哪个门进哪个门出(还有公交... 模拟人生4玻璃墙在哪5 地暖管漏水,停止供暖,会不会再漏?6 无抵押无担保货款的 真的可以去信吗?有认识信誉的留一下QQ我...5 力学物理性能检测钢板HB是指什么内容? 模仿视频出事故,办公室小野方赔偿,为何众多网友认为是讹人案例...105 网面运动鞋脏了怎么办?112 梦到黑色的人形气球1 Weblogic和Tomcat的区别3 我喜欢的女生说自己肚子不舒服,该怎么回复?13 现在农村货款五万元的需不要担保 二年级日记怎么写50字67 当公立中学教师一个月工资大概多少6 关于汽车保养的专业英文单词86 weblogic和tomcat负载均衡的差异2 梦见气球是什么意思啊!8 收缩变形和热变形都是一种焊接变形4 同样的代码和数据为什么在tomcat中就比weblogic执... 安卓手机锁屏了忘记密码怎么解锁2 不同的金属的热膨胀系数都是多少?在钢中加入各种元素是否影响其...1 网面运动鞋脏了怎么办?1 第一次是对方自己做的伤情鉴定,第二次是我们要求做的鉴定,还可...7 追求的女生问?恋人之间该有的那种微妙的感觉你有么?对我。她叫... 补偿金和赔偿金的区别279 c语言什么时候使用数组,什么时候使用指针?11 银行里做柜员工作的女孩,适合做老婆吗?4 英语关于车的单词350 tomcat和weblogic发布同样一个项目两者出现不同?3 日记10篇50字829 CAD中如何设置图层我要步骤?6 楼房地暖管用了一冬天,没发现漏水现象。可刚停暖二天,发现地腹... 模拟人生3如何建造斜面墙 硅胶原材料的热膨胀系数是多少 100摄氏度的时候膨胀多少1