Linux C语言 指针

 前言

指针的学习


提示:以下是本篇文章正文内容,下面案例可供参考

一、指针的基本用法

1.指针的作用:

使程序简洁、紧凑、高效 

有效的表示复杂的数据结构

动态内存分配

能直接访问硬件

能够方便的处理字符串

得到多于一个的函数返回值

2.学习方法:

多编程、多画图

3.指针的概念:内存单元的地址称为指针,专门用来存放地址的变量,称为指针变量。

大小:所有数据类型的指针在32位机上是4个字节,64位是8个字节

一个指针变量只能指向同类型的变量。

类型说明符 *变量名;

指针变量的值只能是变量的地址!

int i,*p = &i; 

int i,*p;

p = &i; 

上面两种等价

指针p指向的是i存放的起始地址,i占4个字节(整形)

&和*是互逆操作,例如&a就是取变量a的地址,而*p就是取指针变量p所指向的内存单元里的内容

p-指针变量,内容是地址量

*p-指针所指向的对象,内容是数据

&p-指针变量p占用的储存区域的地址,是个常量 

二、指针的运算

指针的运算实质就是地址的计算,指针只能进行算术运算、关系运算和赋值运算

不同类型的两个指针实行加减整数运算是无意义的

p+n:指针向地址大的方向移动n个数据

p-n:向地址小方向

p++或++p:指向地址大的方向移动1个数据

p--或--p:向地址小方向

p-q:两个指针指向的地址位置之间相隔数据的个数,公式:(p-q)/类型字节长度

指针可以和0进行等于或不等于的关系运算 

NULL指针代表0(空指针) 

三、指针与数组

数组元素的地址是指数组元素在内存中的起始地址

int a[10];a  和   &a[0]等价

指针的一次相加是以其所指向对象的数据宽度为单位的。

*(a+2)就是取指针a后面第二个对象的内容,等价a[2]

 a[i] 等价 p[i] 等价*(a+i)等价*(p+i)

数组名是地址常量,指针是地址变量。数组名不允许被赋值

四、指针与二维数组

p+i 移动了i个数,相当于移动了i列,p也称列指针。

inta[2][3]相当于有a[0]和a[1]是一个一维数组的名,分别含有3个元素,就是第一行和第二行

数组名加1,是移动一行元素

a代表第一行首地址,a[0](&a[0][0])代表第一行第一列元素的地址,a+1代表第二行的首地址

a[1](&a[1][0])代表第二行第一列元素的地址,依此类推。

表达里面的内容直接解引用,例如a[1][1],*(&a[1][0]+1),*(a[1]+1),*(*(a+1)+1)

储存行地址的指针变量,叫行指针变量

例如:int a[2][3];int (*p)[3];

五、字符指针与字符串

char s[10];char *p; p = s; 

字符指针就是储存字符变量的地址

当一个字符指针初始化为指向一个字符串常量时,不能对字符指针变量的目标赋值

char *s = "Welcome!" ;

六、指针数组

int *p[2];

char *n[9];

 七、多级指针void 指针const

把一个指向指针变量的指针变量,称为多级指针。

int m = 100,*p;

int **q;

p = &m;

q = &; 

相当于int **q = &p   int *p = &m   int m = 100;

多级指针的运算:例如int **p,p+1移动一个int*变量所占的空间。

void指针是一种不确定数据类型的指针变量。需要通过强制类型转换然后指向如何数据类型的变量或数组。

void *<指针变量名> 

const修饰变量,可以使变量常量化。 

const int m = 10;

int const m = 10;//这两种等价 

const int *p;//可以改p,*p是常量不能修改

int *const p;//可以改*p,p是常量不能修改

const int *constp; //地址和内容都不能改

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值