最近linux很火,年前对linux再详细了解了个大概,结合在windows平台活跃与强大无比的C++,最终得出一个结论:C语言依然强大。
过年回来,便对的C语言充满了兴趣,于是乎去网上下载了教程回来,细细研读,基础编程思想始终是很重要的。
首先,入手的便是C语言的核心精华部分,指针。要理解指针就要一步步理解下面的点:
1. 我们所使用的内存单元在物理上线性的,所以内存地址也是一系列连续的,每个内存单元都有一个固定的,不会被修改的地址。
2. 定义一个变量,编译系统就会为该变量分配相应的内存单元,这就意味着每个变量在内存都会有固定的、具体的地址,当然数据类型不同的变量所占据的内存单元数目也不相同。
3. 一个地址唯一指向一个内存变量,这个地址就是指针,然后用来存放这个地址的变量就是指针变量了。指针变量其实也就是一个变量,用了保存地址作用的。
设一组指针变量p a、p b、p x、p y、p m、p c h 1、p c h 2,分别指向上述的变量 a、b、x、y、m、c h 1、c h 2,指针变量也同样被存放在内存,二者的关系如图 6 - 2所示:
4. 关于运算符:
&运算符:取地址运算符,&m即是变量m的地址。
*运算符:指针运算符,*pa即是表示其所指向的变量。
Int *pa;
Float *pb;
Char *px;
定义了3个指针变量,pa指向了一个整型变量,pb指向了一个实型变量,px指向了一个字符型变量。也就是说,pa、pb、px分别存放了整型变量、实型变量、字符型变量的地址。
Int m=3 ;
Float f=4.5 ;
Ch=’a’ ;
我们进行操作:
Pa=&m;
Pb=&f;
Px=&ch;
上述操作表示,将变量m的地址赋给指针变量pa;将变量f的地址赋给指针变量pb;将变量ch的地址赋给指针变量px
*指针变量,其含义是指针变量所指向的值。
若p=&a; 则称p指向变量a,或者说p具有了变量a的地址。
在以后的程序处理中,凡是可以写& a的地方,就可以替换成指针的表示p,a就可以替换成为* p。
指针与数组
1. 定义一维数组,在内存也有系统分配的存储空间,数组名就是数组在内存的首地址(a[10]的a)。
2. 数组名数组的首地址,也就是数组的指针。
3. 定义一个指针变量,并将数组的首址传给指针变量,则该指针就指向了这个一维数组。
int a[10] ;
int *ptr ; /* 定义数组与指针变量*/
做赋值操作:ptr=a; 或 p t r = & a [ 0 ] ;
a是数组的首地址,&a[0]是数组元素a[0]的内存地址,a[0]地址就是数组的首地址
1) ptr+n与a + n表示数组元素a [ n ]的地址,即&a[n] 。
2) * ( p t r + n )和* ( a + n)就表示为数组的各元素即等效于a [ n ]。
4. 指向数组的指针变量也可用数组的下标形式表示为 p t r [ n ],其效果相当于* ( p t r + n )。
5. *ptr++所表示的意义。
*ptr表示指针所指向的变量;ptr ++表示指针所指向的变量地址加1个变量所占字节数。
指向整型变量,则指针值加 2,若指向实型,则加4,依此类推。
指针与二维数组
定义一个二维数组:int a[3][4];
其中a是二维数组的首地址, & a [ 0 ] [ 0 ]既可以看作数组0行0列的首地址,同样还可以看作是二维数组的首地址,a [ 0 ]是第0行的首地址,当然也是数组的首地址。
我们就可以把二维数组看成是由 n行一维数组构成,将每行的首地址传递给指针变量,行中的其余元素均可以由指针来表示。
对指针法而言,程序可以把二维数组看作展开的一维数组: