黑马程序员——C语言指针

 ——- android培训java培训、期待与您交流! ———-

在C语言中,指针占有一个非常重要的位置。所以,学号C语言,就必须学好指针这个变量。
下面,我就对指针这个变量进行详细的解读。

一.指针的概念

指针:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
在内存中,变量是这样表示的如

int a = 10 ;         //定义一个整型变量,赋值为10    

这句话,就在内存中做了如下的事情:

 地址     OX10
变量名      a
变量值     10 

一般来说变量的值都为数字、字符等内容,但是指针变量的变量值为一个地址。

int *p;    //定义一个指向整形的指针p
p=&a;      //把a的地址赋予指针变量p
 地址     OX20
变量名      p
变量值     OX10          //a的地址

二.指针的类型

指针的类型就是指针地址所指向数据的类型。从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。
类型:

  • 整型指针
int *ptr;           //指针的类型是int * 
  • 字符型指针
char *ptr;          //指针的类型是char * 
  • 指向指针的指针
int **ptr;          //指针的类型是 int ** 
  • 数组中的指针
int (*ptr)[3];      //指针的类型是 int(*)[3] 
  • 指向数组指针的指针
int *(*ptr)[4];     //指针的类型是 int *(*)[4] 

3.指针的基本运算

指针可用的运算为’+’,’-‘运算,每当指针加减时,并不是物理地址加减,而是加减的值乘以指针指向类型在内存中占用的物理空间的大小。即:

int a[2]={10,20};     
int *p;             //指针类型为int  
p=&a;               
p=p+1;             //p实际增加量的为1*(sizeof(int))

4.’*’与’&’

说到指针,不得不提’*’与’&’这两个符号。

  • ‘*’可以理解为取地址所保存的值;
int a=10;
int *p;
p=&a;
print("\n%d",*p);     //打印出来的是p指向a的值
  • ‘&’可以理解为取变量的地址;
int a=10;
print("\n%d",&a);     //打印出来的是a的地址

‘*’与’&’是一对相反的运算:

int a=10;
print("\n%d",*(&a);       //打印出来的是10,即  *(&a)=a

5.指针与数组的关系

当我们一遍这样定义一个数组:

int a[10];

其实当这样操作后,就相当于定义了一个整形指针指向了数组的第一个数。即:

a=&a[0];

所以,取数组中各元素,也可以用指针的方法:

int a[10]={0,1,2,3,4,5,6,7,8,9};
int v; 
v=a[0];         //也可写成:v=*a; 
v=a[3];         //也可写成:v=*(a+3); 
v=a[4];         //也可写成:v=*(a+4); 

6.函数指针

可以把一个指针声明成为一个指向函数的指针。

int fun1(char*,int); 
int (*pfun1)(char*,int); 
pfun1=fun1; 
int a=(*pfun1)("abcdefg",7);//通过函数指针调用函数。 

可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为 实参。

int fun(char*); 
int a; 
char str[]="abcdefghijklmn"; 
a=fun(str); 
int fun(char*s) 
{ 
int num=0; 
for(int i=0;i 
{ 
num+=*s;s++; 
} 
return num; 
) 

这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。前面说 了,数组的名字也是一个指针。在函数调用中,当把str作为实参传递给形参s后 ,实际是把str的值传递给了s,s所指向的地址就和str所指向的地址一致,但是 str和s各自占用各自的存储空间。在函数体内对s进行自加1运算,并不意味着同时对str进行了自加1运算。

以上就是我对指针要点的总结。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值