1、二维数组
(1)定义:
默认行优先; 其他语言有列优先;
int a = 10;
int arr[10] = {1,2,3,4};
int brr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int crr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int drr[3][4] = {1,2,3,4,5};
int err[][4] = {1,2,3,4,5,6,7,8,9,10};
|
(2)使用
brr[2][1] = 100;
for(int i=0;i<3;++i)
{
for(int j=0;j<4;++j)
{
printf("%d ",brr[i][j]);
}
printf("\n");
}
(3)二维数组函数传递
void Show(int arr[3][4])
{
for(int i=0;i<3;++i)
{
for(int j=0;j<4;++j)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
Show(arr);
return 0;
}
(4)矩阵逆置
将一个二维数组的行和列的元素互换,存到另一个数组中:
int main()
{
int brr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int frr[4][3] = {};
for(int i=0;i<3;++i)
{
for(int j=0;j<4;++j)
{
printf("%d ",brr[i][j]);
}
printf("\n");
}
for(int i=0;i<3;++i)
{
for(int j=0;j<4;++j)
{
frr[j][i] = brr[i][j];
}
}
for(int i=0;i<4;++i)
{
for(int j=0;j<3;++j)
{
printf("%d ",frr[i][j]);
}
printf("\n");
}
return 0;
}
结果:
(5)找矩阵最大值
找到一个3-4大小的矩阵,求取其中最大值,返回行号和列号;
int main()
{
int brr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for(int i=0;i<3;++i)
{
for(int j=0;j<4;++j)
{
printf("%d ",brr[i][j]);
}
printf("\n");
}
int max=brr[0][0];
int row=0;
int col=0;
for(int i=0;i<3;++i)
{
for(int j=0;j<4;++j)
{
if(max < brr[i][j])
{
max = brr[i][j];
row = i;
col = j;
}
}
}
printf("max=%d\n%d %d\n",max,row,col);
return 0;
}
结果:
2.局部变量作用域、生命周期
局部变量:
定义在函数内部变量; 其作用域在函数内部; 其生命周期从进入函数时创建,函数结束就销毁;
错误示例:
char *GetMemory()
{
char str[]="hello";
return str;
}
int main()
{
printf("%s\n",GetMemory());
return 0;
}
3、Swap交换方法
(1)交换的方法
方法一:第三方变量(最好)
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n",a,b);
int tmp = a;
a = b;
b = tmp;
printf("%d %d\n",a,b);
return 0;
}
方法二:+= 或者 -=
int main()
{
int a = 10;
int b = 20;
int c = 1000000000;
int d = 2000000000;
printf("%d %d\n",a,b);
printf("%d %d\n",c,d);
a += b;
b = a - b;
a = a - b;
c += d;
d = c - d;
c = c - d;
printf("%d %d\n",a,b);
printf("%d %d\n",c,d);
return 0;
}
结果:
方法三:使用 ^=
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n",a,b);
a ^= b;
b ^= a;
a ^= b;
printf("%d %d\n",a,b);
return 0;
}
结果:
4、关于交换函数Swap的相关写法与错误示例
正确代码:
void Swap(int *p1,int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n",a,b);
Swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
结果:
错误示例1:
void Swap(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n",a,b);
Swap(a,b);
printf("%d %d\n",a,b);
return 0;
}
上面的代码错误点在于没有使用指针,子函数的变量值无法真正传递到主函数中。两者的地址不同,导致子函数中的变量交换只是子函数内进行交换,无法传递到主函数中去。子函数中的变量在子函数运行就重新定义,即使与主函数中的变量名相同,地址也不相同。 此类错误和for循环情况相识:
#include <stdio.h>
int main()
{
int i=0;
for(int i=0;i<2;i++)
{
;
}
printf("%d\n",i);
}
错误示例2:
void Swap(int *p1,int *p2)
{
int *tmp;
tmp=p1;
p1=p2;
p2=tmp;
}
该写法错误点在于没有出现解引用,它定义了一个整形指针tmp对p1,p2进行交换,导致交换的只是地址,并没有对数进行交换。 假设p1指向a(p1=&a),p2指向b(p2=&b), 则这一步操作其实是让原本指向a变量的p1指向b,让原本指向b变量的p2指向a,但并没有改变a,b原本的值。
错误示例3:
void Swap(int *p1,int *p2)
{
int *tmp;
*tmp=*p1;
*p1=*p2;
*p2=*tmp;
}
上述写法的错误是出现了野指针。
野指针(也称悬挂指针)
即指针*tmp没有初始化,他没有指向的变量,导致计算机没有访问地址的权限,这个地址可能存在,也可能不存在。是个你没有访问权限的地址。 NULL:空指针,表示当前指针无效。 这与定义了一个整型变量a,在没有给a赋值的情况下输出a的情况相识。 该写法可修改为在定义一个整型变量x,把x的地址赋值给tmp即可完成交换。修改后的代码如下:
void Swap(int *p1,int *p2)
{
int *tmp;
int x;
tmp=&x;
*tmp=*p1;
*p1=*p2;
*p2=*tmp;
}
总结
一个函数想要修改另一个函数的值,必须 1.传指针; 2.解引用; (缺一不可)
5、交换函数bug
bug示例
void Swap1(int *p1,int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void Swap2(int *p1,int *p2)
{
*p1 += *p2;
*p2 = *p1 - *p2;
*p1 = *p1 - *p2;
}
void Reverse1(int *arr,int len)
{
for(int i=0,j=len-1;i<=j;i++,j--)
{
Swap1(&arr[i],&arr[j]);
}
}
void Reverse2(int *arr,int len)
{
for(int i=0,j=len-1;i<=j;i++,j--)
{
Swap2(&arr[i],&arr[j]);
}
}
void Show(int *arr,int len)
{
for(int i=0;i<len;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n",a,b);
Swap2(&a,&b);
printf("%d %d\n",a,b);
int arr[] = {1,2,3,4,5,6,7,8,9,10,11};
printf("原数组arr:\n");
Show(arr,sizeof(arr)/sizeof(arr[0]));
Reverse1(arr,sizeof(arr)/sizeof(arr[0]));
printf("使用第三方变量交换后的数组arr:\n");
Show(arr,sizeof(arr)/sizeof(arr[0]));
int brr[] = {1,2,3,4,5,6,7,8,9,10,11};
printf("原数组brr:\n");
Show(brr,sizeof(brr)/sizeof(brr[0]));
Reverse2(brr,sizeof(brr)/sizeof(brr[0]));
printf("不使用第三方变量交换后的数组brr:\n");
Show(brr,sizeof(brr)/sizeof(brr[0]));
return 0;
}
结果:
|