数组的概念:一组数据类型相同的元素组合在一起
1、数据类型相同 2、地址连续
数组的定义:1、数组定义在函数体外,(相当于全局变量)不初始化,元素都为0
2、数组定义在函数体内,(相当于局部变量)不初始化,元素为随机值
3、数组定义在函数体内,(相当于用static修饰局部变量)用static修饰,不初始化,元素都为0;
数组的访问:
冒泡排序的本质思想:从左到右两两依次比较,如果前一个数大于后一个数,就交换位置;反之,不变。
字符数组的本质就是字符串。
scanf与gets的区别:
1、scanf是标准输入函数,他每次输入都会采用键入的方式,不会去检查缓冲区有无内容
2、gets会先去检查缓冲区有没有东西,如果缓冲区有内容,他会率先去读取缓冲区的内容
注意:
scanf每次输入后,会在缓冲区遗留 空格回车tab键
gets每次输入完毕之后,他会自动清空缓冲区里面的内容
字符串的处理函数:strlen(求字符串的实际长度,不包含’\0')
strcpy(字符串拷贝函数,将数组2的内容完全拷贝给数组1,包括‘\0’,相当于完全拷贝)
strncpy(将数组2的前n个拷贝给数组1,不包含'\0')
strcat(字符串连接函数,将数组2的内容连接至数组1中,会覆盖数组1的'\0')
strcmp(字符串比较函数,比较两个字符串的大小)
二维数组:他是元素为一维数组的一维数组,他的本质还是一维数组。
二维数组的访问:
调用函数的注意事项:
1、需要将实参的值传递给形参,实参的个数和数据类型必须和形参一样
2、实参可以是变量,常量,表达式,必须是一个确定的值
3、实参和形参是两块独立的空间
4、传参实际上是将实参的值拷贝给形参
5、形参在函数调用时被定义,函数调用完毕之后,释放
指针是一种数据类型,是一种保存地址的数据类型。 (int*)
指针的本质就是内存单元的编号。
*的作用:1、作为双目运算符:表示乘法
2、定义变量时,表示指针这种数据类型
3、作为单目运算符,取值*p(取地址里面的值)
二级指针:保存一级指针的地址 (int **)
指针的算术运算:
p+n:p+n相当于向地址增大的方向移动n个数据类型
实际的变化:向地址增大的方向移动:n *sizeof(p指向的数据类型)个字节
p-n: p-n相当于向地址减小的方向移动n个数据类型
实际的变化:向地址减小的方向移动:n*sizeof(p指向的数据类型)个字节
p++:p向地址增大的方向移动一个数据类型(p指向的数据类型)
p--:p向地址见效的方向移动一个数据类型(p指向的数据类型)
p-q:(p和q的数据类型要相同)//两个之间相差的元素
注意:1、指针可以进行计算,同时指针常量也可以进行计算,++,--除外
2、只有在访问连续的空间时,指针的运算才有意义
注意:printf右结合
可以通过指针变量去访问数组:
总结:
1、数组名代表的是,数组首元素的地址,是一个指针常量,不可以++ ,--;
2、上面三种情况都相当做指针处理,在64os占8个字节,在32os占4个字节
指针与二维数组的关系:
1、a、 &a[0]、&a[0][0]他们的值相同,但是意义不一样
a: int (*)[3],:指向一维数组的指针
a[0]:int *:指向一个整型变量
a[0][0] : int
2、为什么说a不是int**
如果a的数据类型是int**,那么他指向的数据类型就是int *,那么他+1,应该移动8个(64os)/4个(32os)字节,然而!我们给a+1,他移动了12个字节,移动了一个数组。所以,a指向的是一维数组(这个数组中有三个元素)
3、nt a[2][3] :理解:a中有两个元素,这两个元素都是一维数组,这个一维数组中又有三个元素,都为int类型
4、指向的是(a[0]),a[0]又是一个一维数组,所以我们说a指向了一个一维数组