C语言指针与数组

C语言指针与数组

一级指针

指针操作一维数组

  • 数组名: 代表了这段内存首地址
#include<stdio.h>
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("%d\t", *p);
		//*p等效p[0]  取当前地址对应内存中值
	}
	return 0;
}
//no.3
//非正常操作:指向其他元素开始操作数组
#include<stdio.h>
int main()
{
	int a[3] = { 1,2,3 };
	int* p = &a[2];//指针指向第三个数
	printf("%d\n", *p);//打印指针所指向的数
	printf("%d\n", p[0]);//打印指针所指向的数
	printf("%d\n", p[-1]);//打印指针所指向的数的前一个数
	printf("%d\n", p[1]);//打印指针所指向的数的后一个数,此处由于超出数组长度,没有这个数,所以打印的是-858993460
	return 0;
}
  • 一级指针操作字符串
#include<stdio.h>
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;
}

指针操作二维数组

  • 二维数组基础知识
    1. 数组名:指向数组的指针
    2. 行地址:数组名[i];
#include<stdio.h>
int main()
{
	int array[2][3] = { 1,2,3,4,5,6 };
	int* p = &array[0][0];
	printf("%p\n", array);//打印数组第0行的首地址
	printf("%p\n", array[0]);//打印数组第0行的首地址
	printf("%p\n", &array[0][0]);//打印数组的首地址

	printf("%p\n", array + 1);   //打印数组第1行的首地址(即4的地址)
	printf("%p\n", array[1]);	//打印数组第1行的首地址(即4的地址)
	printf("%p\n", p + 1);		 //打印数组第二个元素地址(即2的地址)
	printf("%p\n", array[0] + 1);//打印数组第0行第1个元素的地址(即2的地址)
	return 0;
}
  • 两种方法
    1. 一级指针操作二维数组 (二维数组在内存连续的)
#include<stdio.h>
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;
}
  1. 数组指针操作二维数组
#include<stdio.h>
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;
}
  1. 数组指针操作二维数组的变形
//看得懂就行,一般不用
//*(p+i)与p[i]即(p+i)[0]之间的转换
#include<stdio.h>
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\n", *(*(p + i) + j));
			//一维数组:p[i] 等效 *(p+i)
			printf("%d\n", *(p[i] + j));
			//取* 等效数组下表运算 *(p+i)  (p+i)[0]
			printf("%d\t", *((p + i)[0] + j));
			printf("%d\t", ((p + i)[0] + j)[0]);
			printf("%d\t", (p[i] + j)[0]);
		}
		printf("\n");
	}
}
  1. 用数组操作多个字符串
#include<stdio.h>
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 <stdio.h>
int main() 
{
	int a = 1;
	int* p = &a;		//一级指针变量存储的是普通变量的地址
	int** pp=&p;		//二级指针变量存储一级指针变量地址
	//*地址 --->得到当前地址对应内存中的值
	printf("%d\t%d\n", *p, p[0]);
	printf("%d\t%d\n", **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("%d\n", pp[i][j]);
		}
		printf("\n");
	}
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值