第一篇博客C语言指针

第一篇博客C语言指针

个人理解:
指针就是内存地址,好比快递员知道您的地址。此时如果有两个指针就是相当于两个快递员,快递员可以和快递员之间告诉所知道的地址;p=q,p就知道q指向的地址了
所有变量都是指针变量
例如数组a,a所代表的就是数组首地址
p=&a,一级指针指向数组a的首地址,此时p就相当于a,可以当a用,a[0]可表示为p[0],
a,a+1,a+2同p,p+1,p+2
p为a的首地址所以找到地址加上*就是取地址里的数字
若是二维数组
(*q)[2],2表示步长
若q=b
移位步长不一致会warning,原来是4个字节,把二维数组b看成一维数组组成,对应字节数为一维数组的大小例如b[3][2],移位为8字节。
第二种方法q=b[0]也可以解决此问题直接为一维数组地址,步长也对应。
行指针降级一级指针
q+i是行指针取出来是移动i行,加上星号改变指针的性质,从行指针变为一级指针
星(q+i)
一级指针移动j位就是二维数组b[i][j]的地址,此时再加一个星号就是取出该b[i][j]地址里的数
即:
星(星(q+i)+j)

运行结果

原代码

#include<stdio.h>
#define N 5
int main()
{
	int a[N],b[3][2]={{0,1},{2,3},{4,5}};
	char fruit[2][7]={{"apple"},{"pear"}};
	int i,j,n,x,y;
	int *p,(*q)[2];
	x=sizeof(fruit)/sizeof(fruit[0]);
	puts("指针原地址:");
	printf("p:%p\n",&p);
	printf("q:%p\n",&q);
	puts("遍历一维数组方式遍历二维字符串数组fruit:");
	for(i=0;i<x;i++)
		printf("%s\n",fruit[i]);
	p=a;
	puts("一级指针移位性质对比:");
	printf("p:%p,%p\n",p,p+1);
	printf("a:%p,%p\n",a,a+1);
	puts("please input 5 number");
	for( i=0;i<N;i++)
		scanf("%d",p++);
	p=a;
	puts("指针遍历一维数组a");
	for( i=0;i<N;i++)
		printf("%d",*p++);
	puts("");
	q=b;
	p=b[0];
	puts("行指针地址移位性质对比:");
	printf("p:%p,%p\n",p,p+1);
	printf("q:%p,%p\n",q,q+1);
	printf("b:%p,%p\n",b,b+1);
	n=sizeof(b)/sizeof(int);

	puts("一级指针遍历二维数组b");
	for( i=0;i<n;i++)
		printf("%d",*p++);
	puts("");
	puts("行指针降级一级指针遍历二维数组");
	for( i=0;i<3;i++)
	{
		for(j=0;j<2;j++)
		{
			printf("%d,%d,%d,%d\n",b[i][j],q[i][j],*(*(b+i)+j),*(*(q+i)+j));
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值