C语言的指针

来源:互联网 发布:淘宝的实拍保护 编辑:程序博客网 时间:2024/06/15 09:18

C语言的强大之处在于可以对内存进行直接操作和管理,但是同时对内存的管理和使用也让C语言变得更难掌握,因为Java中内存的管理是由虚拟机来完成的,开发人员不需要关心内存的申请和释放。其实指针就是一个变量,其值为另一个变量的地址-内存位置的直接地址。就像其他变量或常量一样,在使用指针存储其他变量地址之前,要对其进行声明。

一、指针的类型

int    *ip;    /* 一个整型的指针 */double *dp;    /* 一个 double 型的指针 */float  *fp;    /* 一个浮点型的指针 */char   *ch;     /* 一个字符型的指针 */

#include<stdio.h>void main() {int t = 89;int *ip = &t;printf("%#x\n", ip);//指针存储的变量地址printf("%d\n", *ip);//取指针内存储的变量地址的对应的值getchar();}

注意:

int *ptr = NULL;//指针不确定指向哪个内存地址时,为NULL

void *v;//指针指向了变量的地址,但是变量的类型不确定,可以是任意类型


1、void指针是一种特别的指针,不确定指针的类型,也就是不确定指针的长度
void *vp
//说它特别是因为它没有类型
//或者说这个类型不能判断出指向对象的长度

2、任何类型的指针都可以赋值给void指针
void *p;
int *ip;
p=ip;
//不需转换
//只获得变量/对象地址而不获得大小

3.void指针赋值给其他类型的指针时都要进行转换
int *p=(int*)vp;
//转换类型也就是获得指向变量/对象大小

4.void指针不能复引用
*p//错误
因为void指针只知道,指向变量/对象的起始地址
而不知道指向变量/对象的大小(占几个字节)所以无法正确引用

5.void指针不能参与指针运算,除非进行转换
(int*)p++;
//p==p+sizeof(int)


二、指针的运算

1、指针的基本运算:+ - ++ --

#include<stdio.h>void main() {int t = 89;int *ip = &t;int *ip2 = &t;printf("地址ip2=%d\n", ip2);ip2++;*ip2 = 90;printf("%#x\n", ip);//指针存储的变量地址printf("%d\n", *ip);//取指针内存储的变量地址的对应的值printf("%d\n", *ip2);printf("地址ip2=%d\n", ip2);getchar();}
结果:

地址ip2=11532044
0xaff70c
89
90
地址ip2=11532048


指针与数组的操作:

#include<stdio.h>void main() {int a[10] = { 1,25,4,6,35,8,9,65,8,85, };int *p = a;for (int i = 0; i < sizeof(a)/sizeof(int); i++){p++;printf("p=%d\n", *p);printf("地址p=%d\n", p);}getchar();}

结果:

p=25
地址p=19200436
p=4
地址p=19200440
p=6
地址p=19200444
p=35
地址p=19200448
p=8
地址p=19200452
p=9
地址p=19200456
p=65
地址p=19200460
p=8
地址p=19200464
p=85
地址p=19200468
p=-858993460
地址p=19200472


2、指针可以进行算数的比较运算:

指针可以用关系运算符进行比较,如 ==、< 和 >。如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较。

原创粉丝点击