1、指针的定义
指针:在程序中定义一个变量,在进行编译的时候就会给该变量在内存中分配一个地址,通过访问这个地址可以找到所需的变量,这个变量的地址叫做改变量的"指针"。
在低级语言的汇编语言中就是直接通过地址来访问内存单元的,在高级语言中一般使用变量名来访问内存单元,但是C语言作为高级语言提供了通过地址来访问内存单元的方式。
2、指针变量
指针变量:一个变量专门用来存放另外一个变量的地址,就称改变量为指针变量。
(1)指针变量的一般形式:
类型说明 * 变量名
其中”*“表示该变量是一个指针变量,变量名即定义为指针变量名,类型说明表示本指针变量所指向的变量的数据类型
(2)指针变量的赋值
一般形式为:& 变量名;
定义指针变量的同时就赋值,例如:
int a;
int *p=&a;
先定义指针然后再赋值,例如:
int a;
int *p;
p=&a;
注意:这两种赋值语句的区别就是如果在定义完指针变量之后再赋值注意不要加"*"
(3)"&"和 " * "运算符
运算符&是一个返回操作数地址的弹幕运算符,也叫做取地址运算符,例如:
int a;
int *p;
p=&a;//将变量a的内存地址赋值给p,这个地址就是该变量在计算机内部的存储位置
运算符 * 是单目运算符,叫做指针运算符,作用就是返回指定地址内的变量值
int a;
int *p=&a;
a=*p;//将变量p所指向地址的值赋值给a
(4)“&* ” 和" *&"的区别
由于“ * ”和“&”的运算符优先级相同,所以按照从右到左的运算。
int a;
int*p=&a;
因此“&* p”先进行*“ * "运算,*p是数值a;再进行”&“运算,于是就相当于取变量a的地址。
” *&p“先进行的是”&"运算,&a是 取变量a的地址;再进行“ * "运算,于是就相当于取变量a所在地址的值,实际上就是a;
#include<stdio.h>
#include<stdlib.h>
int main()
{
long i;
long *p;
printf("please input number:\n");
scanf("%d", &i);
p = &i;
printf("the result1 is:%ld\n", &*p);
printf("the result2 is:%ld\n", &i);
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
long i;
long *p;
printf("please input number:\n");
scanf("%d", &i);
p = &i;
printf("the result1 is:%ld\n", &*p);
printf("the result2 is:%ld\n", *&i);
printf("the result3 is:%ld\n", i);
printf("the result4 is:%ld\n", *p);
system("pause");
return 0;
}
3、指针的自加自减运算
指针的自加自减运算不是简单的加1减一,而是根基指针指向的数据类型的大小而改变
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
int *p;
printf("please input number:\n");
scanf("%d", &i);
p = &i;
printf("the result1 is:%d\n", p);
p++;
printf("the result2 is:%d\n", p);
system("pause");
return 0;
}
整型变量在内存中占用4个字节,指针变量是指向变量i的地址的。所以p++不是简单的在地址上加1,而是指向下一个存放整型数的地址。结果如下
#include<stdio.h>
#include<stdlib.h>
int main()
{
short i;
short *p;
printf("please input number:\n");
scanf("%d", &i);
p = &i;
printf("the result1 is:%d\n", p);
p++;
printf("the result2 is:%d\n", p);
system("pause");
return 0;
}
因为变量是短整型,占用2个字节,所以p++之后是加2.结果如下: