第二周学习心得

指针是C语言中广泛使用的一种数据类型 ,利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串。
一.指针变量的类型说明
定义指针变量的一般形式为:
类型说明符 变量名
其中*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
应注意,一个指针变量只能指向同类型的变量。
二.指针变量的引用
C语言提供了专门的地址运算符&,以取变量的地址。其表达式:&变量名
该表达式的值就是变量的地址,因此可以这样给指针变量px赋初值:
px=&a;
这种赋值的 前提是指针变量px与一般变量a的 类型 必须一致!另外,不可以直接将一个常数赋给指针变量(除0以外。因为指针值为0表示这是一个空指针)

1、指针常量与常量指针

int i;
const int * p2 = &i;
int const *p2=&i;

int * const p1 = &i;

p2是不可改变地址的常量,即指针常量,表示不能通过这个指针去修改变量(并不能使那个变量成为const)。也就是说可以做如下操作:i=26; p=&j;但是*p=26不可以!(*p是const)

p1是指向常量的指针,即常量指针,它所指向的地址内容是不可改动的,但其本身确实能够改动的。所以例如*p=26;是可以的,但是不可以做q++类似的运算。

即:判断哪个被const了的标志是const在*的前面还是后面
如果const在“*”的前面,那么表明指针所指的东西是不能被改变的。
如果const在星号的后面。那么表明指针不能被修改。

2.指针变量的运算
(1)指针变量的初始化赋值
(2)把一个变量的地址赋予只想相同数据类型的指针变量
例如:int a,*pa;
pa=&a;//把整型变量a的地址赋予整形指针变量pa
(3)把一个指针变量的值赋予指向相同类型变量的另一个指针变量。
例如:int a,*pa=&a,*pb;
pb=pa;//把a的地址赋予指针变量pb
(4)把数组的首地址赋予指向数组的指针变量
例如:int a[5],*pa;
pa=a;(数组名表示数组的首地址,故可赋予指向数组的指针变量pa)
也可写为:pa=&a[0];当然也可以采取初始化赋值的办法:int a[5],*pa=a;

#include <stdio.h>
int main()
{
	int  x[6]={0,1,2,3,4,5,},a,b,*p;
	p=x;
	printf("%d %d %d\n",*p,*(p+2),*(p+5));
	a = *p++;//等价于*(p++)
	p=&x[0];
	b = *++p;//等价于*(++p) 
	printf("%d %d\n",a,b);
	return 0; 
}

分析:星p++实际上等价于星(p++),表示先取p所指元素的值,再把指针变量+1,即指向当前元素的后一个元素。而*++p等价于星(++p),表示先把指针变量+1,然后再取所指向元素。
3.两指针变量之间的运算
只有指向同一数组的两个指针变量之间才能进行运算,否则将毫无意义。
(1)两指针变量相减。
两指针变量相减所得之差是两个指针 所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组长度(字节数)。但是两个指针变量不能进行加法运算。因为毫无意义。
(2)两指针变量进行关系运算
指向同一数组的两指针变量进行关系运算可表示他们所指数组元素之间的关系。
例如:
pf1==pf2表示pf1和pf2指向同一数组元素
pf1>pf2表示pf1处于高地址位置。
pf1>pf2表示pf2处于低地址位置。

三.指针与数组

#include <stdio.h>
int main()
{
	int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12,},i,*p;
	
	for(i=0;i<3;i++)
	{
		for(p=a[i];p<a[i]+4;p++)
		printf("%d\t",*p);
		printf("\n");
	}
	return 0; 
}

输出结果:
1 2 3 4
5 6 7 8
9 10 11 12
a为二维数组名,此数组有3行4列,但也可以这样来理解:数组x由三个元素组成:{1,2,3,4},{5,6,7,8}和{9,10,11,12}。这三个元素的名字分别为:a[0],a[1],a[2]。这称为二维数组的一维数组表示。

既然a[0],a[1],a[2]是数组名,则a[0]代表第0行第0列元素的地址&a[0][0]。a[1]代表第1行第0列的元素的地址&a[1][0]。根据地址运算规则,一般而言,a[i]+j即代表第i行第j列元素的地址,即&a[i][j]。

另外,二维数组元素a[i][j],*(a[i]+j),(星(a+i))[j]几种表示形式是等价的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值