2021-7-29 指针

指针

void Swap_Int(int* ap, int* bp)
{
	assert(ap != nullptr && bp != nullptr);
	int tmp = *ap;
	*ap = *bp;
	*bp = tmp;
}
void Move_K(int* ar, int n, int k)
{
	assert(ar != nullptr);
	k = k % n;
	Reverse_Ar(ar, 0, k - 1);
	Reverse_Ar(ar, k, n - 1);
	Reverse_Ar(ar, 0, n - 1);
}
void Reverse_Ar(int* ar, int left, int right)
{
	while (left < right)
	{
		Swap_Int(&ar[left], &ar[right]);
		left++;
		right--;
	}
}
#define ARSIZE 10
struct Ar_Node
{
	int ar[ARSIZE];
	int num;//大小,个数
	int start_index;//起始的下标
};
void Print_Ar(struct Ar_Node* pnode)
{
	assert(pnode != nullptr);
	int i = pnode->start_index;
	for (int j = 0; i < pnode->num; ++j)
	{
		printf("%d", pnode->ar[i]);
		i = (i + 1) % (pnode->num);
	}
	printf("\n");
}
int main()
{
	Ar_Node x = { 12,23,34,45,56,67,78,89,90,100,10,2 };
	Print_Ar(&x);
	return 0;
}

数组作为函数的形参时,为什么要退化为指针的概念?

作业:

(1)循环移动数组

int ar[10] = {1,2,3,4,5,6,7,8,9,10};
右移一个数据元素
输出{10,1,2,3,4,5,6,7,8,9};
右移k个数据元素,k=3;
输出{8,9,10,1,2,3,4,5,6,7};
实现:
    Right_Move-Ar
    Right_Move_Ar_k
    Left_Move_Ar
    Left_Move_Ar_k
struct Ar_Node
{
	int* ar;
	int num;
	int start_index;
};
int Print_Ar(struct Ar_Node* pnode)
{
	assert(pnode != nullptr);
	int i = pnode->start_index;
	for (int j = 0; j < pnode->num; ++j)
	{
		printf("%d", pnode->ar[i]);
		i = (i + 1) % pnode->num;
	}
	printf("\n");
}
void Left_move_ar(struct Ar_Node* pnode, int k)
{
	assert(pnode != nullptr && k <= 0);
	pnode->start_index = (pnode->start_index + k) % pnode->num;
}
int GetElem(struct Ar_Node* pnode, int pos)
{
	assert(pnode != nullptr);
	assert(pos >= 0 && pos < pnode->num);
	return pnode->ar[(pnode->start_index + pos) % pnode->num];
}
void SetElem(struct Ar_Node* pnode, int pos, int val)
{
	assert(pnode != nullptr);
	assert(pos >= 0 && pos < pnode->num);
	pnode->ar[(pnode->start_index + pos) % pnode->num] = val;
}
void Right_Move_Ar(struct Ar_Node* pnode, int k)
{
	assert(pnode != nullptr);
	pnode->start_index = (pnode->start_index - k + pnode->num) % pnode->num;
}
int main()
{
	Ar_Node x = {12,23,34,45,56,67,78,89,90,100,10,0 };
	Print_Ar(&x);
	for (int i = 0; i < x.num; ++i)
	{
		printf("%d", GetElem(&x, i));
	}
	printf("\n");
	Left_move_ar(&x, 2);
	return 0;
}

二维数组

一级指针存放变量的地址,二级指针存放一级指针的地址

int a3,a2,a1,a0;
int *p3,*p2,*p1,*p0;
int **s;
char a3,a2,a1,a0;
char *p3,*p2,*p1,*p0;
char **s;
typename **p;
p+1;  p+sizeof(typename*)*1;//指针---4字节
*p+1;  *p+sizeof(typename)*1;
sizeof(ar0),&ar0---Elem type,Elem num
其他都是数组首元素的地址
int ar2[4],ar1[4],ar0[4];
int **s;
s+1;
s+sizeof(int *)*1;

int *s[4];//开辟4个空间,每个空间存放的是整形类型的指针
int (*s)[4];//s是一个指针,存放的是数组的地址,s+1,加的是数组的大小,16字节
int main()
{
	int ar[4] = { 1,2,3,4 };
	int(*s)[4] = &ar;
	return 0;
}

类型名 数组名 [行表达式] [列表达式]

一个二维数组,本质上是由多个一维数组构成的

定义 int ar [3] [4] 的二维数组 ,由3个一维数组组成,每一个一位数组的大小是4个整型元素

int main()
{
	int ar[4];
	sizeof(ar);//16
	int* s = ar;
	int(*sar)[4] = &ar;

	int br[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	sizeof(br);//48
	int(*p)[4] = br;
	int(*pbr)[3][4] = &br;
	return 0;
}

二维数组的首元素是一个一维数组

一维数组的首元素是一个整形量

上一篇:3 | 随机信号的参数建模法


下一篇:python求数组中连续相同值的个数