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

何为指针 指针这玩意说白了,就是用来存储一个变量地址的东东 如图:(编辑器为vc2010) include void main(){int

何为指针

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

(编辑器为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]);//输出字母e
	getchar();
}

数组指针的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);

}

指针函数

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

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("地址以获取\n");
	return x;
}

文件指针

这个就有意思了,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语言指针内容请搜索好代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好代码网!

标签: c语言 指针