比较通俗易懂的c指针笔记 (一)

来源:互联网 发布:行知实验学校怎么样 编辑:程序博客网 时间:2024/04/28 05:13
                                    比较通俗易懂的c指针笔记  (一)                                                                   
理解指针:
指针是一个其数值为地址的变量。注意它也是一个变量。
变量和指针的联系和区别:
什么是变量?编写程序时变量一般有两种属性:变量名、数值。当程序被编译和加载后,同一个变量在计算机中的两个属性:地址和数值。变量的地址可以看作计算机中变量的名称。通俗的讲声明一个变量就是在内存中分配一块存储空间,并且用变量名表示该存储空间的“名字”。而指针指向的是一块存储空间。稍后详细介绍。
间接运算符:
*是间接运算符的写法。看例子:
int a=3;
int *ptr;
ptr=&a;
*ptr=3;
可以看出*运算符是获取该地址下存放的数值。该地址即指针指向的变量的地址下的数值,这里是变量a的地址下的数值也就是3。
指针的声明:
int *pi;
char *pc;
等等。其中*pc和*pi代表的是内存地址中存放的数值。而星号表示pi和pc为一个指针变量。int,char这是声明了变量的类型,并且说明了其占用的存储空间的大小。pi为int型指针。pi+1是什么?后面介绍。
插曲,谈数组:
数组本身就是一系列具有空间连续性的内存地址。例如:
int a[6];代表一个具有6个元素的数组,也可以看出它有6块连续的内存空间。其中数组名a就表示该数组首元素的地址。例如:
char a[6];
scanf("%s",a);
这里的a没有用取地址赋修饰。a[0]则代表一个元素。
谈指针不得不谈地址:
在c中,对一个指针加1的结果是对该指针增加1个存储单元(storage unit),对于数组而言地址会增加到下一个元素的地址,而不是下一个字节。(这里所说的运算其操作对象是地址。)
例如:
#include<stdio.h>
#define SIZE 4
int main(void)
{
short dates[SIZE];
short *pti;
short index;
double bills[SIZE];
double *ptf;
pti=dates;
ptf=bills;
printf("%23s %10s\n","short","double");
for(index=0;index<SIZE;index++)
printf("poiters+%d:%10p %10p\n",
index,pti+index,ptf+index);
return 0;
}


部分运行结果:
short double
pointers+0:   0012ff78 0012ff50
pointers+1 0012ff7A0012ff58
可以看出pointers+1加了一个存储单元。shor类型的是两个字节为单位增加。double是8个字节为单位增加的。
指针的数值就是它指向的对象的地址,而对象的地址通常是首字节的地址。