指针

简单的说指针就是地址,在这里我们可以把计算机的内存看作是一个街道上的一排房屋,每个房屋都可以房屋都可以容纳数据,每个房屋都有一个门牌号用来标示自身的位置。


*cp++这边出现了两个运算符,这两个运算符位于同一个优先级,且结合性自右向左,因此,它相当于*(cp++),这里的运算涉及三个步骤:
(1)产生cp的一份拷贝
(2)++操作符增加cp的值
(3)在原cp拷贝的部分执行间接访问操作,因此表达式的值是提取cp的内容。

*++cp它相当于*(++cp),该表达式先将cp的值加一,再取其中的内容。

malloc 函数是动态分配内存的,通常用于指针的初始化,其函数原型为void *(size_t size);它所分配的内存空间系统不会自动回收,所以应该使用free()函数将分配的内存释放掉,否则将会出现内存泄漏的问题。

很多用户都习惯在初始化时将指针设置为NULL,这是个好习惯,但是在这里需要注意的是,对NULL指针进行解引用操作是非法的,因为它没有指向任何东西,因此,在对指针进行间接引用的时候,通常先判断给指针是否为空,这样才不会出现过多的错误!

函数的参数不仅可以是整型,实型,字符型,也可以是指针类型,它的作用是将一个变量的地址送到另一个函数中,这样就可以通过形参的改变来达到实参的改变,因为他们指向了同一块内存区域。

数组名代表了数组的起始地址,可以在运算中作为指针参与,但不允许被赋值。

由于在C语言中实现指针的效率往往高于数组下标的使用效率,因此,在编译器中对于数组的下标操作全部转换成对指针的偏移量的操作。数组中的下标与指针的偏移量是相等的。

int a[10],b[10];
.......
void copy(int *a,int *b)
{
   int i;
   for(i=0;i<10;i++)
     *(b+1)=*(a+1);
}
建议在调用函数的驻足声明时采用指针的形式,这样符合C语言编译的本意。

对于存储空间的分配,在指针中有一个特殊情况,即字符常量,指向字符串常量的指针在定义的时候可以赋给它一个字符串常量,如
char *p="Hello World!";
但是不可以int *p=1;
还要注意这个时候,初始化指针所创建的字符串常量是被定义为只读的。如果用户想试图通过修改指针来修改这个字符串常量,程序就会出现未定义的行为。

在多维数组中,读者可以依次对这些维数进行降维处理,例如,有三维数组,a[5][4][3],那么a[i][j]和a[i]表示的都是地址值,其中a[i][j]的指针偏移量为最后一维单位,a[i]的指针偏移量为最后两维单位。

在C语言中,函数本身不是变量,但每个函数也有其入口地址,这个地址是在编译时就被分配了的,这个地址也称函数的指针。因此,用户可以定义指向函数的指针,这种指针可以被赋值,存放在数组中,传递给函数及作为函数的返回值。其形式为:
数据类型  (*指针变量名)()
int (*p) ();
char (*p)();
这样就定义指定返回值的函数指针,但是并没有指明它具体指向了哪个函数,将其指向一个具体的函数的过程就是函数指针的初始化,如下
p=sum;
当然在这之后还可以指向其他具有同样返回值的函数。
在给函数指针赋值时只需给出函数名而不用给出具体的函数。
对于指向函数的指针变量,像p+n,p++等是没有意义的。
在调用函数指针的时候括号是不能省的如int sum(int n);
p=sum;
(*p)(5);
等价于sum(5);

指针数组就是数组每一个元素都是指针的数组,如一维的指针数组定义如下:
数据类型名  *数组名[数组长度];
int *p[5];

C语言规定main()函数的参数只能有两个,习惯上这两个参数写成argc和argv,其中第一个参数必须是整型变量,第二个必须是指向字符串的指针数组。
main(int argc,char *argv[]);
它是通过DOS提示符下命令行来实现的:
可执行文件名  参数  参数  参数  。。。。。
argc参数表示了命令行中参数的个数(注意文件名本身也算是一个参数),argc的值是系统根据实际值自动赋给的如
C:/>E624  BASIC  dbase  FORTRAN
有四个参数所以argc=4

指针的指针就是存放这些指针变量的地址的指针,它的一般格式如下:
数据类型  **变量名;
char **p;


结构体指针是指向结构体的一个指针,即结构体中第一个成员的首地址,因此在使用之前应该对结构体指针初始化,即分配整个结构体长度的字节空间
struct string
{
  ...
  ...
};
struct string student;
student=(struct string *)malloc(sizeof(struct string));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值