服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 带你分分钟玩转C语言指针

带你分分钟玩转C语言指针

2022-12-21 14:48Huterox C/C++

c语言指针其实是一个整形变量,与其它数据不同的是,它的作用是用来存储其它变量的地址,下面这篇文章主要给大家介绍了关于C语言指针的相关资料,需要的朋友可以参考下

何为指针

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

带你分分钟玩转C语言指针

(编辑器为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
a的地址为%p
prt存放的值为%p
prt的内存地址为%p
prt所存的地址对应的值为%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
",i,p,i,p[i]);
	
	}
	getchar();
}

带你分分钟玩转C语言指针

我们发现当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
",i,p[i],i,*p[i]);
	
	}
	getchar();
}

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

 

字符串数组

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

#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
",p); //%s 会读取第一个字符的地址知道读到''
	printf("%c",p[1]);//输出字母e
	getchar();
}

 

数组指针的sao气操作

先看一段代码

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

带你分分钟玩转C语言指针

现在我们发现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
",p[1][i]);
	}
	getchar();
}

带你分分钟玩转C语言指针

 

二级指针

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

带你分分钟玩转C语言指针

 

函数指针

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!
");
	p(x);

}

带你分分钟玩转C语言指针

 

指针函数

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

int* go (int* x,int* y)

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

#include<stdio.h>
void main(){
	
	int *go(int *x);
	int a=5,*p;
	p=go(&a);
	printf("a的地址为:%p,值为:%d",p,*p);
	getchar();
}

int *go(int *x){
	printf("地址以获取
");
	return x;
}

带你分分钟玩转C语言指针

 

文件指针

这个就有意思了,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)

总结

到此这篇关于C语言指针的文章就介绍到这了,更多相关C语言指针内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

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

延伸 · 阅读

精彩推荐
  • C/C++详谈C++ socket网络编程实例(2)

    详谈C++ socket网络编程实例(2)

    这篇文章主要为大家介绍了C++ socket网络编程实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    ufgnix080212052022-02-28
  • C/C++C语言 数据结构堆排序顺序存储(升序)

    C语言 数据结构堆排序顺序存储(升序)

    这篇文章主要介绍了C语言 数据结构堆排序顺序存储(升序)的相关资料,需要的朋友可以参考下...

    super_yc6642021-05-12
  • C/C++详解C语言中的ttyname()函数和isatty()函数的用法

    详解C语言中的ttyname()函数和isatty()函数的用法

    这篇文章主要介绍了C语言中的ttyname()函数和isatty()函数的用法,是C语言入门学习中的基础知识,需要的朋友可以参考下...

    C语言教程网4792021-03-11
  • C/C++C++11 智能指针的具体使用

    C++11 智能指针的具体使用

    本文主要介绍了C++11 智能指针的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Reset。8682021-12-21
  • C/C++C++之Boost::array用法简介

    C++之Boost::array用法简介

    这篇文章主要介绍了C++之Boost::array用法简介,较为详细的分析了Boost::array中的常见用法,并用实例的形式予以总结归纳,需要的朋友可以参考下...

    C++教程网5332021-02-18
  • C/C++7种排序算法的实现示例

    7种排序算法的实现示例

    这篇文章主要介绍了7种排序算法的实现示例,需要的朋友可以参考下...

    C语言程序设计5512021-01-20
  • C/C++关于C++中定义比较函数的三种方法小结

    关于C++中定义比较函数的三种方法小结

    下面小编就为大家带来一篇关于C++中定义比较函数的三种方法小结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网5082021-04-19
  • C/C++C语言实现宾果消消乐

    C语言实现宾果消消乐

    这篇文章主要为大家详细介绍了C语言实现宾果消消乐,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    清幽水莲9402021-08-10