# 一,指针
## 1,指针概念
```
概念:储存内容为地址的变量,称之为指针变量,简称指针。
```
## 2,指针变量定义
```
定义指针变量的语法如下:
<存储类型> <指针指向的数据类型> *指针变量名;
例如:
int *pi; //pi ---指向int型数据的指针
char *pc=NULL; // pc ----指向char型数据的指针,同时给指针赋值空值NULL
```
## 3, 指针的用途
```
将数据的地址保存到指针中,目的是通过指针间接操作数据。
例如:
int main(void)
{
int a = 120;
int* pa;
pa = &a; //将a的地址保存到pa中,我们就说pa指向a
printf("a = %d\n",a);
a = 110;
printf("a = %d\n",a);
printf("*pa = %d\n",*pa); //通过指针pa取变量a的值打印
*pa = 350; //通过指针pa给变量a赋值
printf("a = %d\n",a);
return 0;
}
```
## 4, 指针的运算
```
1》赋值运算 =
给指针变量赋值,需要注意:左值和右值类型必须一致
例如:
int a = 100;
float b = 2.4;
int *p;
p = &a ; //正确-左值int*的指针,右值必须是int类型数据的地址
p = &b ; //错误-左值int*的指针,右值不能是float类型数据的地址
2》取值运算 *
取值运算也称为解引用,表示指针指向的数据。 注意:取值之前,指针必须先赋值,如果没有赋值将会出现不可预料的错误。
例如:
int main(void)
{
int a = 120;
int* pa;
float *pf,f;
pa = &a;
printf("a = %d\n",a);
a = 110;
printf("a = %d\n",a);
printf("*pa = %d\n",*pa); //通过指针pa取变量a的值打印
*pa = 350; //通过指针pa给变量a赋值
printf("a = %d\n",a);
f = 2.6;
pf = &f;
printf("*pf = %f\n",*pf); //pf没有赋值
return 0;
}
3》取地址运算 &
取地址表示数据在内存中的空间地址。
例如:
int a = 120; &a ----表示a在内存中的空间地址
float *p; &p ----表示p在内存中的空间地址
4》加法运算 +
一个指针p只能加一个整数n,表示指针p向高地址偏移sizeof(*p)*n字节
例如:
int main(void)
{
char c;
short s;
int i;
char* pc = &c;
printf("&c = %p\n",&c);
printf("pc = %p\n",pc);
printf("pc + 1 = %p\n",pc+1);
printf("pc + 3 = %p\n",pc+3);
printf("-------------------------\n");
short* ps = &s;
printf("&s = %p\n",&s);
printf("ps = %p\n",ps);
printf("ps + 1 = %p\n",ps+1);
printf("ps + 3 = %p\n",ps+3);
printf("-------------------------\n");
int* pi = &i;
printf("&i = %p\n",&i);
printf("pi = %p\n",pi);
printf("pi + 1 = %p\n",pi+1);
printf("pi + 3 = %p\n",pi+3);
return 0;
}
5》减法运算 -
一个指针p可以减一个整数n,表示指针p向低地址偏移sizeof(*p) * n字节
同类型指针可以相减,表示两个指针之间的内存空间中可以存放多少个指针指向的数据,所以结果为整数
6》关系运算
两个指针中的地址高低比较
```
## 5, const关键字
```
当指针指向某个数据时,可以通过指针操作数据,但是,有时候只希望指针使用指向的数据而不要取修改指向的数据,为了保护指向的数据,在定义指针时,会通过const对指针进行限制。
const有三种形式的用法:
1》第一种形式
int a = 120;
const int *p = a; //int const *p = &a;
*p 只能打印a的值,不能给*p赋值。
例如:
int main(void)
{
int a = 120;
const int *p = &a;
//*p = 240;
printf("a = %d\n",a);
return 0;
}
2》第二种形式:
int a = 120,b = 240;
int *const p = &a;
p 只能使用,不能赋值
例如:
p = &b; //错误
3》第三种形式 ----前两种形式结合
int a = 120,b = 240;
const int * const p = &a;
*p 不能赋值,只能使用
p 也不能赋值,只能使用
```