C语言指针

一、简易认识指针

指针通常来说是存储内存地址的,并且指针本身就是一种类型,就像整型,浮点型一样,这个一会再说,先看一个简单的例子:

 

#include <stdio.h>

int main()
{
    int a = 3;
    int *p ;
    p = &a; 
    *p = 111;
    printf("a = %d.\n",a);

    return 0;
}

运行结果:

a = 111.

这是一个最简单的指针运用了,理解了这个对以后的更高级的才能理解。来看一下这例程:

最核心的代码为中间的三行,理解了这三行,就可以认识到指针究竟是什么鬼了。可以通过下面的图片来认识。

是

 

假设变量a的内存地址为0x7f7f7f,然后执行p = &a之后,那么变量p所对应的内存中将存储a的地址。当*p时通过存储的地址从而间接找到变量a。

二、指针与数组

对于数组来说,数组的首元素地址和数组的地址是一样的,从而对于一个指针来赋值的话可以使用两种方式:

#include <stdio.h>

int main()
{
  int i = 0,a[5] = {1,2,3,4,5};
	int *p;
	p = a;
	//p = &a[0];一般不使用这种方式
	printf("使用数组下标的方式来访问数组元素\n");
	for(i = 0;i < 5;i++)
	{
		printf("a[%d]:%d\n",i,a[i]);
	}
	printf("使用指针的方式来访问数组元素\n");
	for(i = 0;i < 5;i++)
	{
		printf("*(p+%d):%d\n",i,*(p+i));
	}
	
    return 0;
}

其运行结果如下:

使用数组下标的方式来访问数组元素
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
使用指针的方式来访问数组元素
*(p+0):1
*(p+1):2
*(p+2):3
*(p+3):4
*(p+4):5

三、指针的运算

指针变量本身存储的是某个变量的地址值,因此对于一些运算是没有价值和意义的。有意义的加法,减法、++、--。

*、++、--这三个运算符都是从右向左,因此谁在右边,先算谁。从而*p++ = *(p++) = *p、p+=1  .++放在后面,与放在前面不同,举例3 + (++i) 与3 + (i++)结果是不同的。

#include <stdio.h>

int main()
{
  int i = 0,a[5] = {1,2,3,4,5};
	int *p;
	p = a;
	
	printf("*p++:%d\n",*p++);
	p = a;
	printf("*++p:%d\n",*++p);
	p = a;
	printf("++(*p):%d\n",++(*p));
	p = a;
	printf("(*p)++:%d\n",(*p)++);
	
    return 0;
}

运行结果:

*p++:1
*++p:2
++(*p):2
(*p)++:2

分析这四个运算,注意++的先算和后算,并且注意++的作用对象是地址还是值本身。

四、函数传参中使用指针

C语言中函数传参,实参并不是直接传给形参,而是实参先进行一份拷贝,然后将拷贝的传到形参,所以在函数中对形参的改变并不会影响主函数中两个变量的值。因此引入指针。传递变量的地址,在该地址上的操作最终会在变量输出时得到展示,因此传指针,在子函数中对变量的操作,将会改变函数外边的实参。

#include <stdio.h>

void swap(int a,int b);
int main()
{
  	int a,b;
	a = 3;
	b = 5;
	printf("a = %d,b = %d\n",a,b);
	swap(a,b);
	printf("a = %d,b = %d\n",a,b);	
    return 0;
}

void  swap(int a,int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}

普通函数的传参演示:

a = 3,b = 5
a = 3,b = 5

下面是利用指针作为函数参数传递:

#include <stdio.h>

void swap(int *p,int *q);
int main()
{
  	int a = 3,b = 5;
	int *p,*q;
	p = &a;
	q = &b;
	printf("a = %d,b = %d\n",a,b);
	swap(p,q);
	printf("a = %d,b = %d\n",a,b);	
    return 0;
}

void  swap(int *p,int *q)
{
	int temp;
	temp = *p;
	*p = *q;
	*q = temp;
}

运行结果为:

a = 3,b = 5
a = 5,b = 3

在这个例子中需要注意的是,定义两个指针变量时的格式样子。int *p,*q;这样定义才可以,而不能是 int *p,q;这样的话q并不是指针变量而是一个普通的整型变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值