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

C语言指针(分分钟玩转)

发布网友 发布时间:2024-09-26 17:39

我来回答

1个回答

热心网友 时间:2024-10-06 03:17

前言

这个也是以前写博文。

何为指针

指针这玩意说白了,就是用来存储一个变量地址的东东 如图:

(编辑器为vc2010)

#include<stdio.h>void main(){int a,*p;a=5;p=&a;printf("a=%d,p=%p,*p=",a,p,*p);getchar();}

所以通过刚刚的情况,我们发现通过指针我们不仅可以获取一个变量的值还可以直接对变量的值修改

又如下面的例子:

#include<stdio.h>void main(){int a=3;int* prt;prt=&a;printf("a的值为%d\na的地址为%p\nprt存放的值为%p\nprt的内存地址为%p\nprt所存的地址对应的值为%d",a,&a,prt,&prt,*prt);getchar();}数组指针

说到指针只说基本的int char float有什么意思,接下来是一个数组指针 将数组和指针结合起来.当然数组本身在传递的时候就是以指针传递的. 下面是以段代码演示

#include<stdio.h>void main(){int a [5]={1,2,3,4,5},*p,i;p = a;for(i=0;i<5;i++){printf("&a[%d]=%p,a[%d]=%d\n",i,p,i,p[i]);}getchar();}

我们发现当p=a(指针指向数组a)后,指针p可以和数组a一样操作,这就是指针数组.

指针数组

既然说到了指针数组那么就不得不说数组指针,乍一看这两个名字很像,其实差距还是很大的. int *p[] 下面还是以上面的例子为例,我们让输出结果一致

#include<stdio.h>void main(){int a [5]={1,2,3,4,5},*p[5],i;for(i=0;i<5;i++){p[i]=&a[i];}for(i=0;i<5;i++){printf("&a[%d]=%p,a[%d]=%d\n",i,p[i],i,*p[i]);}getchar();}

我们发现,这个东东其实就是一个存储地址的数组,这个内存地址既可以是int char 或者float 同时也可以是数组,这个我们在说完字符串数组后再说.

字符串数组

C语言里面没有string类(java)也没有str(python)只有字符,所以我们引入了字符串数组,用来存储字符串. ('a' 一个字节 "a"两个字节) 这里要注意一下的是,一个字符串数组如 char a[5]="hello",表面上看这里只有五个字符,但是其实在他们的内存分布里面最后面结尾('o'后面)还有一个字符'\0'表示结束,所以只用char a[5]放不下hello,char a[6]="hello"才行.所以"a" 是'a'+'\0'两个字节('\0'不显示)

#include<stdio.h>void main(){char a[6]={'h','e','l','l','o'};//char a[6] ="hello";也行printf("%s",a);getchar();}

此外还要注意一点直接写一个"hello"也是一个字符串数组只不过未命名罢了,我们可以用指针访问

#include<stdio.h>void main(){char *p="hello";printf("%s\n",p); //%s 会读取第一个字符的地址知道读到'\0'printf("%c",p[1]);//输出字母egetchar();}数组指针的sao气操作

先看一段代码

#include<stdio.h>void main(){char *p[3]={"hello","my","friend"};printf("%s",p[1]);getchar();}

现在我们发现p[1]可以和一个字符指针一样操作,也就是说 p[1]等价于

char a[4]="my",*c; c=a; 这里的c就等价于p[1]

#include<stdio.h>void main(){char *p[3]={"hello","my","friend"};int i;for(i=0;i<2;i++){printf("%c\n",p[1][i]);}getchar();}二级指针

这个家伙,就是套娃,看一张图就明白了

函数指针

int (p)( int x) int 指向的函数类型 (p)指针名字 (int x) 所指向的函数所需要输入的参数

这个呢就是一个函数 举个例子

#include<stdio.h>void main(){int go(int x);int x,(*p)(int x);scanf("%d",&x);p=go;//指针指向函数//(*p)(x)也行p(x);getchar();getchar();}int go(int x){printf("you input number is:%d",x);}

这玩意的好处是啥呢, 有了这玩意,我可以直接向一个函数里面传递另一个函数 举例升级

#include<stdio.h>void main(){int go(int x),x;void show(int x, int(*p)(int x));scanf("%d",&x);show(x,go);getchar();getchar();}int go(int x){printf("you input number is:%d",x);}void show(int x, int(*p)(int x)){printf("you have inputed!\n");p(x);}指针函数

说白了这就是一个函数,返回了一个地址如:

#include<stdio.h>void main(){int a=3;int* prt;prt=&a;printf("a的值为%d\na的地址为%p\nprt存放的值为%p\nprt的内存地址为%p\nprt所存的地址对应的值为%d",a,&a,prt,&prt,*prt);getchar();}0

和函数指针长得像,原因在于* 得运算级别比()低所以函数指针加了() 举个例子

#include<stdio.h>void main(){int a=3;int* prt;prt=&a;printf("a的值为%d\na的地址为%p\nprt存放的值为%p\nprt的内存地址为%p\nprt所存的地址对应的值为%d",a,&a,prt,&prt,*prt);getchar();}1文件指针

这个就有意思了,C语言把所有的设备都视为指针. FILE *fp=NULL; fp = fopen("文件路径","w") ? ? ? ? ("w"是打开模式,w写) fprintf(fb,"%s",str) 这玩意和print的用法是一样的只不过前面指明了指针 换句话说 printf("hello) ?与 fprintf(stdout,"hello")一样,stdout屏幕指针,stdin键盘指针 同理 fputs("hello",fp)

接下来是读文件 char s[100] fp = fopen("文件路径","r") fscanf(fp,"%s",s) fgets(s,100,fp) ? ?(100是最大长度) 区别是什么呢,fprintf()读到空格或回车就返回,fgets()读到回车返回 此外还要fread() fread(接收数据的地址,读取多少字节的内容,数据项个数,文件指针) 其他的查手册就好 最后别忘了关闭 fclose(fp)

原文:https://juejin.cn/post/7106466723322134535

热心网友 时间:2024-10-06 03:24

前言

这个也是以前写博文。

何为指针

指针这玩意说白了,就是用来存储一个变量地址的东东 如图:

(编辑器为vc2010)

#include<stdio.h>void main(){int a,*p;a=5;p=&a;printf("a=%d,p=%p,*p=",a,p,*p);getchar();}

所以通过刚刚的情况,我们发现通过指针我们不仅可以获取一个变量的值还可以直接对变量的值修改

又如下面的例子:

#include<stdio.h>void main(){int a=3;int* prt;prt=&a;printf("a的值为%d\na的地址为%p\nprt存放的值为%p\nprt的内存地址为%p\nprt所存的地址对应的值为%d",a,&a,prt,&prt,*prt);getchar();}数组指针

说到指针只说基本的int char float有什么意思,接下来是一个数组指针 将数组和指针结合起来.当然数组本身在传递的时候就是以指针传递的. 下面是以段代码演示

#include<stdio.h>void main(){int a [5]={1,2,3,4,5},*p,i;p = a;for(i=0;i<5;i++){printf("&a[%d]=%p,a[%d]=%d\n",i,p,i,p[i]);}getchar();}

我们发现当p=a(指针指向数组a)后,指针p可以和数组a一样操作,这就是指针数组.

指针数组

既然说到了指针数组那么就不得不说数组指针,乍一看这两个名字很像,其实差距还是很大的. int *p[] 下面还是以上面的例子为例,我们让输出结果一致

#include<stdio.h>void main(){int a [5]={1,2,3,4,5},*p[5],i;for(i=0;i<5;i++){p[i]=&a[i];}for(i=0;i<5;i++){printf("&a[%d]=%p,a[%d]=%d\n",i,p[i],i,*p[i]);}getchar();}

我们发现,这个东东其实就是一个存储地址的数组,这个内存地址既可以是int char 或者float 同时也可以是数组,这个我们在说完字符串数组后再说.

字符串数组

C语言里面没有string类(java)也没有str(python)只有字符,所以我们引入了字符串数组,用来存储字符串. ('a' 一个字节 "a"两个字节) 这里要注意一下的是,一个字符串数组如 char a[5]="hello",表面上看这里只有五个字符,但是其实在他们的内存分布里面最后面结尾('o'后面)还有一个字符'\0'表示结束,所以只用char a[5]放不下hello,char a[6]="hello"才行.所以"a" 是'a'+'\0'两个字节('\0'不显示)

#include<stdio.h>void main(){char a[6]={'h','e','l','l','o'};//char a[6] ="hello";也行printf("%s",a);getchar();}

此外还要注意一点直接写一个"hello"也是一个字符串数组只不过未命名罢了,我们可以用指针访问

#include<stdio.h>void main(){char *p="hello";printf("%s\n",p); //%s 会读取第一个字符的地址知道读到'\0'printf("%c",p[1]);//输出字母egetchar();}数组指针的sao气操作

先看一段代码

#include<stdio.h>void main(){char *p[3]={"hello","my","friend"};printf("%s",p[1]);getchar();}

现在我们发现p[1]可以和一个字符指针一样操作,也就是说 p[1]等价于

char a[4]="my",*c; c=a; 这里的c就等价于p[1]

#include<stdio.h>void main(){char *p[3]={"hello","my","friend"};int i;for(i=0;i<2;i++){printf("%c\n",p[1][i]);}getchar();}二级指针

这个家伙,就是套娃,看一张图就明白了

函数指针

int (p)( int x) int 指向的函数类型 (p)指针名字 (int x) 所指向的函数所需要输入的参数

这个呢就是一个函数 举个例子

#include<stdio.h>void main(){int go(int x);int x,(*p)(int x);scanf("%d",&x);p=go;//指针指向函数//(*p)(x)也行p(x);getchar();getchar();}int go(int x){printf("you input number is:%d",x);}

这玩意的好处是啥呢, 有了这玩意,我可以直接向一个函数里面传递另一个函数 举例升级

#include<stdio.h>void main(){int go(int x),x;void show(int x, int(*p)(int x));scanf("%d",&x);show(x,go);getchar();getchar();}int go(int x){printf("you input number is:%d",x);}void show(int x, int(*p)(int x)){printf("you have inputed!\n");p(x);}指针函数

说白了这就是一个函数,返回了一个地址如:

#include<stdio.h>void main(){int a=3;int* prt;prt=&a;printf("a的值为%d\na的地址为%p\nprt存放的值为%p\nprt的内存地址为%p\nprt所存的地址对应的值为%d",a,&a,prt,&prt,*prt);getchar();}0

和函数指针长得像,原因在于* 得运算级别比()低所以函数指针加了() 举个例子

#include<stdio.h>void main(){int a=3;int* prt;prt=&a;printf("a的值为%d\na的地址为%p\nprt存放的值为%p\nprt的内存地址为%p\nprt所存的地址对应的值为%d",a,&a,prt,&prt,*prt);getchar();}1文件指针

这个就有意思了,C语言把所有的设备都视为指针. FILE *fp=NULL; fp = fopen("文件路径","w") ? ? ? ? ("w"是打开模式,w写) fprintf(fb,"%s",str) 这玩意和print的用法是一样的只不过前面指明了指针 换句话说 printf("hello) ?与 fprintf(stdout,"hello")一样,stdout屏幕指针,stdin键盘指针 同理 fputs("hello",fp)

接下来是读文件 char s[100] fp = fopen("文件路径","r") fscanf(fp,"%s",s) fgets(s,100,fp) ? ?(100是最大长度) 区别是什么呢,fprintf()读到空格或回车就返回,fgets()读到回车返回 此外还要fread() fread(接收数据的地址,读取多少字节的内容,数据项个数,文件指针) 其他的查手册就好 最后别忘了关闭 fclose(fp)

原文:https://juejin.cn/post/7106466723322134535
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何理解“时间就是空间,空间就是时间”? 办公室副主任竞聘演讲稿范文 学校办公室主任竞聘演讲稿范文 最新办公室主任竞聘演讲稿 办公室主任竞聘演讲稿优秀范文 ...堆墨现象,墨线 接地和粘度都正常,请问应如何解决 ...都正常了开始喷印结果喷一条墨线好恐怖怎么解决呀各位老师 威力喷码机 求一份学生会演讲词 大学学生会个人优秀演讲稿 苏州平江路限行吗 编写一个c程序输入abc三个值的数据编写一个c程序输入abc三个值 搭载骁龙845的三防手机如何打破市场固有印象? AGM X3有哪些硬汉特性? pKa蛋白激酶 A (protein kinase A,PKA) pka是什么酶 双侧椎动脉血流速度增快是颈椎病吗 2023年冬天会是冷冬吗? 双侧椎动脉血流速度增快怎么回事 2023年冬季会受到拉尼娜现象影响变冷吗? 塞班岛有哪些景点 塞班岛旅游多少钱 红丸2003的武器叫什么 极兔快递多个单号的物流怎么快速查询? 养三条鱼代表什么成语 有一个背着鱼篓的人爬在树上,边上画有一圈里面有三条鱼♡猜一成语 lg电视连接wifi怎么连? 卧室阳台放什么辟邪 阳台放什么辟邪好 阳台放什么辟邪最旺财呢 阳台放什么绿植可镇宅辟邪 武夷岩茶肉桂饮用的时候可以煮吗 岩茶肉桂饮用可以煮吗 岩茶肉桂可以煮吗 肉桂岩茶适合煮着喝吗?可泡后再煮 文言文《刘清之传》中,博极书传的‘极’是什么意思 租厂房租户要交什么税 沈伐作品 康宝莱茶饮功效和食用目的 物业公司有电梯操作证,租户(厂房)还需要电梯操作证吗 刘德一其它信息 刘乙麟演艺生涯 杨振宁为何选择了翁帆?看看她和杜致礼年轻时的照片,突然就懂了_百度知... 翁帆杜致礼有血缘关系吗 在菜百买了一对耳坠是假的该如何赔偿 ...碰到了右耳发炎了流水,怎么感觉耳钉戴不上去了? 沙河镇雨佳双语艺术幼儿园舔水渍事件 睡觉辟邪放什么花 卧室放什么花卉辟邪 卧室花瓶放什么花辟邪最好 辟邪在家放什么花