指针与取地址符&


指针

<1>要明白指针,首先要明白指针的变量名是什么,比如int *p;这里的指针的变量名是p而不是*p,就好像Java中的数组的定义一样int[] array;指针也可以定义为int* p;表示整数类型的指针,变量名为p;
<2>要明白指针一定是只能保存地址,而保存地址使用的是指针的变量,所以是用变量名p=&a,而不是*p = &a(定义时除外)。
<3>要明白声明定义时的*和后面操作时的*的含义是不同的,如int *p 正如int* p ;表示的是定义一个指针变量,而后面操作时*p = 10;表示的是去操作指针指向的那个地址的内容。
<4>指针变量必须要初始化,否则不知道指向哪个地址。
<5>指针就是用来存放地址的,并且可以通过这个地址来操作对应的内容。只要知道了一个变量的内存地址,那么我们就可以通过指针来操作块内存空间


指针在C语言中占8个字节
定义一个指针变量p
指针变量只能存储地址(p = &a ,而不是p = a)
*表示指向操作,定义时,*只是说明这个变量为指针,而对于操作时,*表示去操作地址

1.指针变量占有8个字节


例:
#include <stdio.h>

int main()
{
   int a = 10;
  
   int* p = &a; //这里的 int* p等价于 int *p
  
   *p = 20;
  
   printf("%d\n",( int) sizeof(p));
}

8
输出为8表示,p变量占8个字节,说明指针在C语言中占8个字节

2.指针变量存储的必须是地址

例:
#include <stdio.h>


int main()
{
   int a = 10;
  
   //int* p = 10;//这是不行的,因为指针变量存储的是地址
  
   int* p = a;//这是不行的,因为指针变量存储的是地址
  
   printf("%d\n",a); //a内存空间的数据被改变了
}

上面的int *p = a;不对,因为p保存的必须是地址,所以应该是int* p = &a;

例:
#include <stdio.h>


int main()
{
   int a = 10;
  
   int* p = &a;
  
   printf("%p\n",&a);
   printf("%p\n",p); 
}



可以看到p保存了变量a的地址,所以输出的结果是一样。

3.声明定义指针变量时的*和操作地址时的*的区别

一个定义,一个是寻找并操作
例:
#include <stdio.h>

int main()
{
   int a = 10;
  
   int *p = &a; //这里是可以的
  
   *p = 20;
  
   printf("%d\n",( int) sizeof(p));
}



上面的 int *p =&a;等价于int* p =&a;同样也等价于下面的语句
int *p ;
p = &a;
就比如
int a;
a = 10;

但是,如下面是不对的
#include <stdio.h>

int main()
{
   int a = 10;
  
   int* p;
  
   *p = &a;
  
   printf("%d\n",( int) sizeof(p));
}

上面的*p = &a;是不对的,因为此时的*的含义不同,此时*是说去操作p指向的地址内容,而,如果这里*p =&a;则表明,将a的地址赋值给p指向的地址的内容即a,但a是个int数据,是不能保持地址的,所以不对。

内存分析:


4.利用指针来接收变量的地址

例:
#include <stdio.h>

int change(int * p)
{
   *p =100;//表示操作传递过来的地址的内存空间中的数据
}

int main()
{
   int a = 10;
  
   change(&a);//这里传递的是地址
  
   printf("%d\n",a); //a内存空间的数据被改变了
}







&取地址符

因为指针是用来存放别人的地址的,所以需要先取出别人的地址,所以需要用到&来取出别人的地址(数组名除外,方法名除外,对象名除外因为这些名词就是他们的首地址)

1.&取地址,指针保存地址

例:
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
   int a = 10;
   int *p = &a; //这里表示取出a的地址后保存到 p指针变量中,即p保存了 a的地址
   printf( "%d\n",*p);
   return 0;
}


2.修改指针指向的那块空间的内存

指针保存那块地址,即指针指向那块地址
例:
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
   int a = 10;
   int *p = &a; //这里表示取出a的地址后保存到 p指针变量中,即p保存了 a的地址
   *p = 100;//表示修改 p指向的那块地址空间的内容,即修改 a的值
   printf( "%d\n",*p);
   return 0;
}




过程分析:
int a = 10;
int *p = &a; 


*p = 100;
*表示操作p指向的内容空间,*p = 100表示操作p指向的内存空间,并给其赋值100







  • 53
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值