指针
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;
}
二维数组的首元素是一个一维数组
一维数组的首元素是一个整形量