指针
<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>指针就是用来存放地址的,并且可以通过这个地址来操作对应的内容。只要知道了一个变量的内存地址,那么我们就可以通过指针来操作块内存空间
定义一个指针变量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