复习:指针

目录

指针变量

指针变量的内容

        引入

        指针变量的值 

间接访问操作符

        概念

运算

        基本运算

指针+/-整数

指针-指针 

        引入

         算术运算和间接访问操作

        自增自减运算符

前置 

后置

应用

指针数组 

语法

指针数组

数组指针

多级指针 

引入

语法

章节问题

指针变量

指针变量的内容

        引入

        一个变量的值就是分配给这个变量的内存位置所存储的值。

	int a = 10;
	int* p = &a;
	printf("a = %d p = %p\n", a , p);
	printf("&a = %p &p = %p\n", &a,&p);
//a	= 10				   p = 000000C9AACFF584
//& a = 000000C9AACFF584 & p = 000000C9AACFF5A8

        指针变量的值 

        引用上图,指针变量p的值是变量a的地址,而非变量a的值。

间接访问操作符

        概念

        通过一个指针访问它所指向的地址的过程称为间接访问,用于执行间接访问的操作符是间接访问操作符。

int a = 10;
int* p = &a;
printf("a = %d *p = %d\n", a , *p);
//a = 10 *p = 10

运算

        基本运算

指针+/-整数

        整数在执行加法运算前,会根据指针所指向类型的大小调整偏移的大小。

        (这也是为什么指针在声明时要注明类型

int* p = 10;
char* q = 'a';
printf("%p %p\n", p, p + 1);
printf("%p %p\n", q, q + 1);
//000000000000000A 000000000000000E
//0000000000000061 0000000000000062
指针-指针 

        前提:两个指针都指向同一数组元素时。

        结果:两个指针在内存中的距离(以数组长度为单位,而非以字节为单位)

	int arr[] = { 1,2,3,4,5 };
	int* p = &arr[3];
	int* q = &arr[0];
	printf("%d\n", p - q);
	//4

        引入

        左值:标识了一个可以存储结果值的特定的地点

        右值:指定了一个

	int arr[] = { 0,1,2,3,4 };
	int* p = &arr[0];
	int b;

         算术运算和间接访问操作

	/*指针加法运算的结果:右值.因为它的存储位置并没有清晰定义*/
	printf("*p + 1 = %d\n", *p + 1);/*1*/ /*取得arr[0]值的一份拷贝并把它 + 1*/
	printf("*p = %d\n", *p);		/*0*/ /*arr[0]仍等于0*/

	/*间接访问的结果:左值&&右值.间接访问跟随指针访问一个特定的地址*/
	*p = 1;
	printf("*p = %d\n", *p);		   /*1*//*arr[0]修改为1*/
	printf("*(p+1) = %d\n", *(p + 1)); /*1*//*访问arr[1]的值*/

        自增自减运算符

1.     b = a ++; // b = a , a = a + 1

        b = ++a ; // a = a + 1 , b = a

2.     优先级:自增自减的优先级大于间接访问操作符

前置 
	b = *++p;//p = p + 1, b = *p
	printf(" b = %d,arr[1] = %d\n", b, arr[1]);
	printf(" p = %p,&arr[1]=%p\n", p, &arr[1]);
	// b = 1,				  arr[1] = 1
	// p = 0000003D3E8FF55C, &arr[1] = 0000003D3E8FF55C
后置
	*p++ = 10;/*优先级:* (p++) = 10 1.后置++: * p = 10 2.p = p + 1*/
			  /* *p = &arr[1],arr[0] = 10 */
	printf("%p %p\n", p, &arr[1]); //0000007EC25BF58C 0000007EC25BF58C
	printf("%d\n", arr[0]);		   //10
	b = (*p)++;	/*1.*p = b 2.*p = *p+1*/
				/*   b = 0    arr[0]=1*/
	printf("%d %d\n", b, arr[0]);
	//0 1
应用

        计算一个字符串的长度函数:

int my_strlen(char* string)
{
	int len = 0;
	while (*string++ != '\0')
	{
		len++;
	}
	return len;
}

指针数组 

语法

        <数据类型> * <指针数组名> [ 大小 ];

        注意:辨析指针数组和数组指针。

指针数组

#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
	int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };
	int* parr[3] = { arr[0],arr[1],arr[2] };
	int i, j;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("%d ", *(parr[i] + j));
		}
		putchar('\n');
	}
	return 0;
}

数组指针

#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
	int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };
	int(*parr)[3]=arr;
	int i, j;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("%d ", *(parr[i] + j));
		}
		putchar('\n');
	}
	return 0;
}

多级指针 

引入

一级指针:指向处理数据的指针变量

二级指针:指向一级指针的指针变量

语法

         语法:<数据类型>**<指针名>;

                可以理解为:

                1.<数据类型>*:表示指针的目标。

                2.*<指针名>; :指针变量。

#include<string.h>
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;

	printf("&a = %p   p = %p   pp = %p\n", &a, p, pp);
//&a = 00000034F4D2F694   p = 00000034F4D2F694   pp = 00000034F4D2F6B8
	printf("&a = %p  &p = %p  &pp = %p\n", &a, &p, &pp);
//&a = 00000034F4D2F694  &p = 00000034F4D2F6B8  &pp = 00000034F4D2F6D8
//--------------------结论:p的地址 == qq的值-----------------------
//2.解引用:
	printf("a = %d *p = %d **pp = %d\n", a, *p, **pp);
//a = 10 *p = 10 *pp = 10
	return 0;
}

章节问题

        一级指针、二级指针、数组指针、指针数组是什么? 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值