刚看完书,说什么也得写点东西总结一下,不自量力挑我认为最困难的部分吧
数组
给我印象最深刻的就是两个字:“左值”,当然还得加上两个字:“不是”。数组名是一个指针,指针是左值,但是数组名在C中不是一个左值,所以在C中不能出现在赋值运算的左边。
要牢记这一点,所以不可以出现把一个数组名当整个数组赋值,要赋值的话,没什么好办法,循环吧,或者用一些库里的函数,但是在用函数的时候,要牢记数组的长度,要提防越界,像我们不经常使用的fscanf这样的函数,有缓冲区,就要顾及他的溢出问题,可以制定一个字段宽度,表示要读入的最大字符数。
要确定数组的元素个数可以用到sizeof如:sizeof(a)/sizeof(a[0]),用数组中的第一个元素的大小去除整个数组的大小。
还有一点需要注意的是:值传递。当用一个简单变量调用函数时,函数会受到被调用的参数的一个拷贝,这就是参数传递,而当一个数组参数的函数被调用时,形参和实参的关系就发生了变化,变成了值传递。(不会在blog里插入图片-_-b)用语言来描述其原因的话,就是因为指针,当数组作为参数传递给函数时,只有数组的基址——数组首元素——数组名传递给函数,作为函数局部栈的地址,这个名字存放了实际数组的地址,所以即便是想象的“值赋值”(当然不能,原因如上),内容也是一样的。如果选择在函数范围内定义的局部数组中的一个元素,那么把偏移量+基地址一样会在实际数组中操作,最终结果是函数声明中定义的形参与函数调用时使用的数组实参是相同的一块内存,而不是一个拷贝。
指针
无疑,指针是C中最精髓的部分,因为指针可以在初始化后,可以同时拥有所指变量的两样东西——值和地址。这就给我们写程序时很大的空间,可以直接与内存对话!这也同样引出了千奇百怪的错误,不知道该怎么表达,其实最根本的是要明白我们在使用指针的时候,知道我们使用的究竟是她的哪个性质!是值?还是地址?于此对应的,指针有两种最基本的操作:
一个是取地址&,主要用于初始化时的赋值操作。&必须是左值。
一个是取指向的值*,*可以取任意指向的值,返回其左值。
对指针的操作犹如打太极一般,有很多招式,但又归于一招。最基础的是分清指针赋值和值赋值:
p1=p2;指针赋值,是p1和p2指向同一位置。
*p1=*p2;值赋值,把p2为地址的内存中的内容赋到p1为地址的内存的。
注意:指针也是有地址的,它本身也需要在内存中开辟一块存储,这块存储空间里是他所指变量的地址,然后根据这个地址,可以找到所指变量的值!
指针可以被运算,但要注意的是指针所指向对象的类型,指针都是一样的——4,而他的指向的解析方式是不同的,所以同样的形式会有不同的运算方法,如:p++,对于int型和对于double型所跨越的实际地址是不同的!
指针和数组
我们使用指针的时候,其作用和其他变量相似,可以把他的行为与基本类型划等号。但是如果是数组,就不同了,数组声明后保有很多内存单元,每个元素都有一个内存单元,数组名不与某个单独的内存单元相对应,而是和整个内存单元集合相对应,所以这一点和普通变量不同。
当变量做最普通的声明时,会体现数组和指针最关键的区别:
int array【5】;和int * p;内存的分配!这样指针是不分配内存的 ,但是数组分配!
阅读(1399) | 评论(1) | 转发(0) |