-
什么是地址
内存单元的编号
-
指针的重要性:
- 表示一些复杂的数据
- 使函数返回一个以上的值
- 直接访问硬件
- 能够更方便的处理字符串是理解面向对象中引用的基础
-
指针的定义:
地址:内存单元的编号从零开始的非负整数
范围:
- 基本类型的指针(重点)
- 指针和数组
- 指针和函数
- 指针和结构体的关系(重点)
-
附注:*的含义
- 乘法:5 * 8
- 定义指针变量:int* p;//定义了一个只能存放int型地址的指针
- 指针运算符号;该运算符,放在已经定义好的指针变量的前面,那么*p表示以p的内容为地址的变量
-
好好区分 int* p; *p
-
普通指针例子:
#include<stdio.h>
int main(void)
{
int *p;
int *q;
int a = 5;
int b = 10;
p = &a; //*p = &a 不可以执行 ,erro
q = &b;
*p = a; //*p等于5
*q = b; //*q等于10
*q = *p; //此时的*p还是等于5
*p = 12; //会改变 a 的数值,即是将a = 12
printf("%p\n", &a);
printf("%#X\n", &a); //以后16进制输出
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", *p); //输出为10,可以赋值但是不可以赋地址
printf("%p\n", p);
printf("%d\n", *q);
printf("%p\n", q); //q储存地址,*q储存数值
*p = *q = 11; //这里会将 a b *p *q 的数值都改为11,a与*p绑定在一起
printf("\n\n %d\n", *q);
printf(" %d\n", *p);
printf(" %d\n", a);
printf(" %d\n", b);
return 0;
}
-
利用指针互换两个数的值
#include<stdio.h>
void exchang(int* p, int* q)
{
int z = 0;
int *t ;
t = &z;
*t = *p;
*p = *q;
*q = *t;
/*
那么
*t = *p
*p = *q
*q = *t 为什么会出错呢 因为 *t 没有初始化,即没有分配地址,如果令 p = q ,就是存放彼此的地址,对*q的数值进行改变那么*p的数值也会发生改变,带*就会有指向性
*/
return;
}
void exchang_2(int* p, int* q)
{
int t;
t = *p;
*p = *q;
*q = t;
return;
}
void exchang_3(int a, int b)
{
int t;
t = a;
a = b;
b = t; //无法互换位置
return;
}
void exchang_4(int* p, int* q)
{
int* t;
t = p;
p = q;
q = t;
return ;
}
int main()
{
int *q;
int a = 3;
int b = 5;
exchang(&a,&b);
printf("a = %d,b = %d\n", a, b);
exchang_2(&a, &b);
printf("a = %d,b = %d\n", a, b);
exchang_3(a, b);
printf("a = %d,b = %d\n", a, b); //无法互换
exchang_4(&a, &b);
printf("a = %d,b = %d\n", a, b); //无法互换
return 0;
}
-
函数输出多个数
#include<stdio.h>
int f(int a, int b)
{
return 0;
}
void g(int* p, int* q)
{
*p = 1;
*q = 2;
//这里修改了 a,b的数值
}
int main()
{
int
a = 3,
b = 5;
//f(a,b);
g(&a, &b);
printf("a = %d b = %d",a,b);//输出为 1 2
return 0;
}