栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言指针与数组

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言指针与数组

C语言指针与数组 一级指针 指针操作一维数组

数组名: 代表了这段内存首地址

#include
int main()
{
	int a[3] = { 1,2,3 };
	int* p = a;   //a-->&a[0]   等效
	//no.1
	//正常操作: 直接存储数组的首地址
	//[]操作等效取*运算
	//直接把指针当作数组名就可以了
	//优点,这种方式稳妥,不容易出错,一般使用这种方式就够了
	for (int i = 0; i < 3; i++)
	{
		printf("%d ", p[i]);
	}
	printf("n");
	//no.2
	//用指针做偏移操作
	for (int i = 0; i < 3; i++)
	{
		printf("%d ", *(p+i));
	}
	printf("n");
	//a=a+3;  不能修改
	//a+3-->&a[3];   等效
	for (p = a; p < a + 3; p++) 
	{
		printf("%dt", *p);
		//*p等效p[0]  取当前地址对应内存中值
	}
	return 0;
}
//no.3
//非正常操作:指向其他元素开始操作数组
#include
int main()
{
	int a[3] = { 1,2,3 };
	int* p = &a[2];//指针指向第三个数
	printf("%dn", *p);//打印指针所指向的数
	printf("%dn", p[0]);//打印指针所指向的数
	printf("%dn", p[-1]);//打印指针所指向的数的前一个数
	printf("%dn", p[1]);//打印指针所指向的数的后一个数,此处由于超出数组长度,没有这个数,所以打印的是-858993460
	return 0;
}

一级指针操作字符串

#include
int main()
{
	char str[] = { "iloveyou" };
	char* p = str;
	puts(p);
	char* pstr = str + 5;
	puts(pstr);
	putchar(p[0]);   //p[0] 等效*p操作,等效取当前地址下面值
	putchar('n');
	putchar(pstr[0]);//打印第六个字符
	return 0;
}
指针操作二维数组

二维数组基础知识

    数组名:指向数组的指针行地址:数组名[i];
#include
int main()
{
	int array[2][3] = { 1,2,3,4,5,6 };
	int* p = &array[0][0];
	printf("%pn", array);//打印数组第0行的首地址
	printf("%pn", array[0]);//打印数组第0行的首地址
	printf("%pn", &array[0][0]);//打印数组的首地址

	printf("%pn", array + 1);   //打印数组第1行的首地址(即4的地址)
	printf("%pn", array[1]);	//打印数组第1行的首地址(即4的地址)
	printf("%pn", p + 1);		 //打印数组第二个元素地址(即2的地址)
	printf("%pn", array[0] + 1);//打印数组第0行第1个元素的地址(即2的地址)
	return 0;
}

两种方法

    一级指针操作二维数组 (二维数组在内存连续的)
#include
int main()
{
	int array[2][3] = { 1,2,3,4,5,6 };
	int* p = &array[0][0];
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", *(p + j + i * 3));
			//j+i*3 把坐标转为第几个元素
		}
		printf("n");
	}

	return 0;
}
    数组指针操作二维数组
#include
int main()
{
	int array[2][3] = { 1,2,3,4,5,6 };
	int(*p)[3] = NULL;    //必须要有括号,和表示的数组列数相同的列数
	//先看括号里面是一个指针
	//数组指针 即指向数组的指针
	//联想整形指针,指向整数
	p = array;
	//这样就可以直接当作数组名去用就行了
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", p[i][j]);
		}
		printf("n");
	}
	return 0;
}
    数组指针操作二维数组的变形
//看得懂就行,一般不用
//*(p+i)与p[i]即(p+i)[0]之间的转换
#include
int main()
{
	int array[2][3] = { 1,2,3,4,5,6 };
	int(*p)[3] = NULL; 
	p = array;
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%dn", *(*(p + i) + j));
			//一维数组:p[i] 等效 *(p+i)
			printf("%dn", *(p[i] + j));
			//取* 等效数组下表运算 *(p+i)  (p+i)[0]
			printf("%dt", *((p + i)[0] + j));
			printf("%dt", ((p + i)[0] + j)[0]);
			printf("%dt", (p[i] + j)[0]);
		}
		printf("n");
	}
}
    用数组操作多个字符串
#include
int main()
{
	//存储多个字符串--->指针数组 多个指针变量
	//整形数组: 多个整形变量
	char* pstr[3] = { "Iloveyou","IMiss","IiIIII" };  //每一行上面字符串可以不相同,并且不浪费
	//int array[3]  array[0] array[1] array[2]
	//pstr[0] pstr[1] pstr[2]; 分别存储的是每个字符串首地址
	for (int i = 0; i < 3; i++) 
	{
		puts(pstr[i]);
	}
	//字符串二维数组也可以存储多个字符串? 列数相同 会导致浪费,多余内存
	return 0;
}
二级指针

高一级指针是用来存放低一级指针变量的地址的

#include 
int main() 
{
	int a = 1;
	int* p = &a;		//一级指针变量存储的是普通变量的地址
	int** pp=&p;		//二级指针变量存储一级指针变量地址
	//*地址 --->得到当前地址对应内存中的值
	printf("%dt%dn", *p, p[0]);
	printf("%dt%dn", **pp, pp[0][0]);
	int array[2][3] = { 1,2,3,4,5,6 };
	//一级指针算偏移
	//数组指针做遍历
	// warning C4047: “=”:“int **”与“int (*)[3]”的间接级别不同(所有这种提醒当作错误处理)
	pp = array;
	for (int i = 0; i < 2; i++) 
	{
		for (int j = 0; j < 3; j++) 
		{
			printf("%dn", pp[i][j]);
		}
		printf("n");
	}
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779437.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号