tips
1.VS里面的解决方案是什么呢?首先要搞清楚解决方案与项目的区别,一个解决方案中可以有多个项目.
2.函数递归的时候一定要有限制条件,并不完全等价于数列的递推公式,光有限制条件还不够,递归在运行的时候必须朝着这个限制条件接近。
3.因此函数递归要注意以下几点:
1,先假设那个函数的功能是成立的。
2,把An个过程分为A(n-1)个过程加上其他过程。
3,一定要加上限制条件,并且随着递归的进行,要不断的逼近这个限制条件,最终让递归停止。
4.当你写下
char arr[ ]="abcdef"时,arr这个字符数组里面有七个元素,分别为‘a’ ‘b’ ‘c’ ‘d’ ‘e’ ‘f’ ‘\0’。
5.C语言中两个变量交换内容一定需要另外一个临时变量。
6.数组传参,形参可以用数组来接收,这是没有任何问题。并且并不会额外又去创建一个数组,用的还是你传进来的数组,形参这儿的数组与实参的数组是同一个数组,不管你数组名字有没有变化,数组传参的时候就是这样一个效果。
7.实际上我想告诉你的是什么呢?数组名其实是地址,是数组首元素的地址,这是一个结论。当你把数组名传进来的时候,传来的是首元素的地址。这时候形参可以用指针来接收,这个指针指向的也是数组首元素的地址了,并且只要知道了首元素的地址,就可以顺藤摸瓜找到后面的所有内容。
8.“%p”就是专门用来打印地址的
数组
数组基本知识
1.数组是一组相同类型元素的集合
2.创建数组的同时给数组一些值,这就叫做数组的初始化。初始化又分为完全初始化(就是说把数组的每一个元素都给它值),不完全初始化(剩余的元素默认初始化为0)。
给数组初始化的时候,大小可以不指定,那个大小不指定的时候,系统会根据你的初始化内容来确定你的数组元素个数。
3.当字符数组不完全初始化的时候,剩余的元素默认初始化为0。由于\0的ACSII码值为0,因此剩余的元素在字符数组当中被解读成\0了。
4.尤其不要忘记如字符串“abcd”,它的后面还带了一个\0,如果没有\0的话,在打印字符串与计算字符串长度的时候都会受到影响。
5.字符串的打印和长度计算都是以/0为结束标志的,如果在打印或者计算长度的过程当中碰不到/0,那就会一直运行下去,直到找到/0为止。
6.全局变量可以全局数组一样 当不初始化的时候,默认初始化都为0。
一维数组的访问与使用
1.对于数组的使用,我们之前介绍了一个操作符[ ](下标引用操作符),它其实就是数组访问的操作符,数组的下标是怎么样的,你懂的。
2.数组的大小(里面元素的个数)可以通过计算得到:sizeof(arr)/sizeof(arr[0]),
特别的,字符数组的大小可以通过strlen来求
但两者还是有差别,你要知道他们运作的原理,strlen()是碰到\0就会停下来的。
一维数组在内存当中的存储
仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。
一维数组在内存当中是连续存放的。随着数组下标的增长,地址是由低到高变化的。因此只要得到数组的首元素地址,就可以根据它的存储规律,顺藤摸瓜,找到后面所有元素的地址。
接下来这个内容非常关键
一个整形(int)在内存当中占了四个字节。由于一个内存单元占一个字节,相当于一个整型int在内存当中占了四个内存单元(每一个内存单元都有他自己的一个地址编号,这个地址\指针是8个16进制表示的)
在数组里面考虑指针的时候,不用去考虑每个内存单元的地址,只需要把目光聚焦到每个元素的地址这一层即可,虽然每个元素可能占多个字节/内存空间,但是以第一个内存空间的地址为该元素的地址。
整形指针加一,其指向的元素就会跳过一个整形。字符指针加一,其指向的元素就会跳过一个字符
操作:利用指针来遍历一维数组:
二维数组
1.二维数组其实就是多行多列的,比如三行四列,二行四列,在这里面放数字的时候是一行一行往下放的。
2.二维数组的行是可以省略的,但是列不能省略。当行省略的时候,编译器由于知道了每行的元素个数,他也会自己排下去的,但是列不能省略。
3.二维数组的访问也是通过下标来实现,二维数组有行号和列号,都是从零开始
二维数组在内存当中的存储
1.二维数组在内存当中也是连续存放的
如下:
正是因为数组在内存当中是线性存放的,因此要遍历数组元素的话,通过下标或者指针都是可以的
二维数组其实也是一维数组的数组,只要把每一行都想象成一维数组
利用指针遍历二维数组
二维数组的行数的求法: sizeof(arr)/sizeof(arr[0]),
二维数组的列数的求法: sizeof(arr[0])/sizeof(arr[0][0])
总之,二维数组在平时思考过程中把它当作一个矩形来对待,有行号与列号,但是在内存中还是线性依次按行排列的。