c语言精髓——指针(附图详解及练习题)

1.指针和指针类型

我们都知道变量有不同的类型,那指针有类型吗?

可以肯定地说,有。

type* 类型的指针表示该指针指向一个type类型的变量。

有了指针类型,就确定了指针的运算规律。

指针+-整数

int main()
{
	int n = 10;
	char* pc = (char*)&n;
	int* pi = &n;

	printf("%p\n",&n);
	printf("%p\n",pc);
	printf("%p\n",pc+1);
	printf("%p\n",pi);
	printf("%p\n",pi+1);

	return 0;
}

输出结果为:

总结:指针的类型决定了指针向前或向后走一步有多大。

指针-指针

指针相减这种操作时允许的,我们来看一个实例:

int my_strlen(char* s)
{
	char* p = s;
	while (*p != '\0')
	{
		p++;
	}
	return p-s;
}

调试结果为:

显然,指针相减与指针的类型是有关的,但并不代表类型决定着指针的大小。

指针的解引用

int main()
{
	int n = 0x11223344;
	char *pc = (char*)&n;
	int *pi = &n;
	*pc = 0x55;
	*pi = 0;
	return 0;
}

重点观察一下内存变化:

不难看出,指针的类型决定了对指针解引用时可操作的字节大小。

2.二级指针

存放指针变量的地址的变量就是二级指针,因此,多级指针的概念与之类似。

在认识了二级指针之后,我们可以尝试一下指针和数组的相关运算,有兴趣可以点击博文让初学者自闭的代码

3.几个关于指针和数组的概念

指针数组

指针数组是一个数组,是一个存放指针的数组。

数组指针

数组指针是一个指针,他有能力指向一个数组。

让我们了解一个简单的数组指针的定义:int (*p)[10];

//这里,p先和*结合,说明p是一个指针,指向一个大小为10个元素的整型数组。所以,p是一个指针,指向一个数组,叫数组指针。

//[]优先级高于*,所以要加上括号,以保证p先和*结合。
函数指针

函数指针仍然是一个指针,它指向一个函数的位置。

函数指针数组

不难理解,这是一个数组,来存放函数的指针。

一个简单的定义:int (*parr[10])();

//这里,arr是一个数组,里面的元素是int (*) ()类型的函数指针

函数指针的数组的指针

函数指针的数组的指针是一个指针,指针指向的是一个数组,数组的元素是函数指针。

4.练习题

int main()
{
	int a[5] = { 1,2,3,4,5 };
	int *ptr = (int*)(&a + 1);
	printf("%d,%d", *(a + 1), *(ptr - 1);
	return 0;
}
//程序的结果是什么

struct Test
{
	int num;
	char* pcname;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
假设p的值为0x100000,以下表达式的值分别是多少?
p + 0x1 = ?
(unsigned long)p + 0x1 = ?
(unsigned int*)p + 0x1 = ?

int main()
{
	int a[4] = { 1,2,3,4 };
	int *ptr1 = (int*)(&a + 1);
	int *ptr2 = (int*)((int)a + 1);
	printf("%x,%x",ptr1[-1],*ptr2 );
	return 0;
}

int main(int argc,char * argv[])
{
	int a[3][2] = { (0,1),(2,3),(4,5) };
	int *p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}
//输出结果是什么?

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值