C语言指针

学习c语言指针,针对数组以及指针的关联及区别进行了理解,为防止忘记,记录一下。

一维数组的指针

#include <stdio.h>

int main()
{
	int array[] = {1,2,3,4};
	int *p = NULL;
	
	p = &array[0];

	printf("address of pointer p : %p\n", p);
	printf("address of array     : %p\n", array);
	printf("address of &array    : %p\n", &array);
	printf("address of p+1       : %p\n", p+1);
	printf("address of array+1   : %p\n", array+1);
	printf("address of &array+1  : %p\n", &array+1);
	
	printf("value of *p	         : %d\n", *p);
	printf("value of *array	     : %d\n", *array);
	printf("value of *p+1        : %d\n", *p+1);
	printf("value of *array+1    : %d\n", *array+1);
	
	return 0;
}

在这里插入图片描述
根据运行结果显示,指针变量p与数组名array的内存地址均位数字第一个数据的内存地址,但是在对它们加1后,所得的结果稍有差异,其中“p+1”和“array+1”的结果是数组第2位的地址,而“&array+1”的地址为跳过array4个数据之后的地址(5000h-4ff0h=10h=16=4*4(4个int地址长度))。

二维数组的指针

#include <stdio.h>

int main()
{
	int (*p)[4] = NULL;
	int array[][4] ={{1,2,3,4},{11,22,33,44},{111,222,333,444}};
	
	p = array;	

	printf("address of pointer p		: %p\n", p);
	printf("address of array		: %p\n", array);
	printf("address of p[0]+1		: %p\n", p[0]+1);
	printf("address of array[0]+1		: %p\n", array[0]+1);
	printf("address of p+1			: %p\n", p+1);
	printf("address of array+1		: %p\n", array+1);
	printf("address of &array		: %p\n", &array);
	printf("address of &array+1		: %p\n", &array+1);
	printf("address of &array+1+1		: %p\n", &array+1+1);
	
	printf("value of **p			: %d\n", **p);
	printf("value of **array		: %d\n", **array);
	printf("value of **p+1			: %d\n", **p+1);
	printf("value of *(*p+1)		: %d\n", *(*p+1));
	printf("value of **array+1		: %d\n", **array+1);
	printf("value of *(*(p+1)+1)		: %d\n", *(*(p+1)+1));
	printf("value of *(p[1]+1)		: %d\n", *(p[1]+1));
	printf("value of *(*(array+2)+1)	: %d\n", *(*(array+2)+1));
	printf("value of *(array[2]+1)		: %d\n", *(array[2]+1));
	
	return 0;
}

在这里插入图片描述

首先说明一下二维数组的格式,array[a][b]中,第一位索引可以为空,第二及以后必须定义长度,array[a][b]定义了一个a(行)*b(列)的数组,引用一张图片:
在这里插入图片描述
在内存中,二维数组也是以连续的地址进行存放,先依次存放a[0]的所有数据,其次是a[1],直到最后。
二维数组的内存地址可以参考一维数组进行分析。二维数组数据的引用需要使用**进行调用,[a]和[b]的调用要放在小括号()内。需要注意一点,在变量定义的时候,开始并没有定义二维数组指针变量的长度,即int (*p)[] = NULL;,这样在进行数据调用时,导致编译报错,所以必须要指定二维数组指针的长度才可以。
在这里插入图片描述
自己感觉,根据这两个形式比较好理解,即一维数组数据a = *(p+1),二维数组数据即在一维基础上增加一个维度,b = *(a+1) = *(*(p+1)+1)。

printf("value of *(p+1)     : %d\n", *(p+1));         /*一维数组*/
printf("value of *(*(p+1)+1): %d\n", *(*(p+1)+1));    /*二维数组*/

虽然稍微理解了数组指针的大概形式,但是发现运行中,指针和数组名的作用是一样的,也就是说数组名其实也是一个指针类型,那这样的话,为数组定义指针的意义在哪里呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值