二维数组:
本质上还是数组,只不过数组中的每一个元素又是数组
我们可以把二维数组看做多行多列的一个平面
声明语法:
类型 数组名[行][列];
例: int nums[3][5];
char chs[2][6]; //2行6列
取值和赋值:
数组名[行][列];
例: nums[0][0]; //取第一行第一列(下标为0的行,下标为0的列)
数组名[行][列] = 数据;
例: nums[0][0] = 20;
二维数组的遍历:
因为它是多行多列,我们正好可以用一个for循环的嵌套来遍历
因为for循环的嵌套,外层可以控制行,内层可以控制列
for(int i=0;i<行数;i++){
for(int j=0;j<列数;j++){
//赋值
//输出
}
}
二维数组计算行数:
数组总长度 / 每一行占用的长度
公式: sizeof(二维数组名) / sizeof(二维数组名[0]);
二维数组计算列数:
某一行占用的长度 / 类型占用的长度
公式: sizeof(二维数组名[0]) / sizeof(类型);
二维数组作为函数的参数:
跟一维数组一毛一样
1.是引用传递:改变了形参的值,实参也会改变
2.在函数内不可以计算出正确地行和列,所以如果要在函数内遍历的话,一定要多传至少1个参数(传入行数,为什么不要列数呢?因为列数确定的)
注意:二维数组作为函数的参数,形参必须定义列数,并且一旦确定好列数,传入的实参一定只能是这个列数的二维数组,其他的会有警告,使用时可能会出问题
三维数组:就是一个数组,只不过这个数组里的每个元素是一个二维数组
………………
N维数组:就是一个数组,只不过这个数组里的每个元素是一个N-1维的数组
指针:
指针就是内存地址。
内存地址:每一个字节都会有一个地址,每个变量只要记住首地址就能找到这个变量
指针变量:
就是保存指针的变量
声明语法:
类型 *指针变量名;
例: int *p;//指向int类型的指针变量
char *pc;//指向char类型的指针变量
指针变量的赋值:
指针变量名 = 地址;
例: p = #
在声明的时候就初始化,那么才*
类型 *指针变量名 = #
int *p = #
怎么使用指针变量?
不用星号来使用:
不用星号代表访问的自己的空间(访问的是自己存的地址)
int *p = #
p;//代表是访问的num的地址
用星号来使用:
用星号代表访问的是别人的空间(访问的是别人空间里存的值)
int *p = #
*p; //代表访问的就是num;
注意:星号的使用场景
如果在声明的时候,*代表类型(或者说,*左边有类型关键字的时候就是代表类型声明)
如果在其他的时候,*代表取别人空间里的值(或者说,*左边没有类型关键字的时候就是代表访问别人的空间)
指针变量作为函数的参数:
指针变量如果作为函数的参数,也是一个局部变量,所以它也会有自己的空间
二级指针:代表一个指针变量指向的是另外一个指针变量
定义格式: 类型 **变量名;
赋值: 变量名 = &一级指针变量名;
例:
int num = 10;
int *p = #//一级指针
int **pp;//二级指针
pp = &p; //指向一级指针p的空间
三级指针:指向二级指针的指针变量。
定义的时候就是三个星
N级指针:指向n-1级指针的指针变量
定义的个时候n个星
*/
#include <stdio.h>
void test(int nums[][5],int row){
for (int i=0; i<row; i++) {
for (int j=0; j<5; j++) {
}
}
}
void test2(int *p){
int abc = 100;
//*p = 200;//影响的主函数的num
//李四在里面不要张三的钥匙,自己去换了一个别人家的钥匙,但是并不会影响到张三手里的钥匙
p = &abc;//这里改值只是改了自己这个函数内的p里存的地址值,不会影响到实参存的地址
}
int main(int argc, const char * argv[]) {
int num = 10;
int *p = #//张三有num的钥匙
test2(p);//张三把钥匙给李四配了一把
printf("%d\n",*p);//10
//指针变量的声明和*号的解释
/*
int *p1,*p3;//声明了p1和p3两个指针变量
int *p5,num1;//声明了p1指针变量和num1整型变量
int *p10,num10,*p11; //两个指针变量分别是p10,p11,还有一个整型变量num10
p10;//访问自己的空间
*p10;//访问别人的空间
*/
//二维数组作为函数的参数
/*
int nums1[10][5];
test(nums1,5);
int num = 10000;
int *p = #//在声明的时候初始化
int *p2;//先声明
p2 = # //后赋值
printf("%d\n",*p);
*/
return 0;
} |
|