什么是指针 ?
指针:其实代表的内存地址
地址就是系统给内存分配的编号
指针变量:存放地址的变量
指针常见的错误:
不给指针赋值, 直接调用, 野指针
指针类型和地址的类型不匹配。 比如:
float t
int* i = &t
#include <stdio.h>
#include <stdlib.h>
main()
{
int i = 3; // 定义了一个int类型的变量i, i的值是 3
&i; // 得到i的地址
//指针变量
int* p = &i; // 定义一个int类型的指针变量p, p的值为i的地址
printf("pause");
}
p 指针变量保存的是一个内存地址值,指向变量的内存地址,int变量的值虽然改变,但是它的内存地址并没有发生改变.
#include <stdio.h>
#include <stdlib.h>
main()
{
int i = 3;
int* p = &i;
printf("i的值为:%d\n",i);
printf("p的值为:%#x\n",p); // 内存地址值一般是16进制, 占位符为:#x
// 修改i的值会不会改变p的值?
i = 5;
printf("修改i后i的值为:%d\n",i);
printf("修改i后p的值为:%#x\n",p);
system("pause");
}
同理,当 p 指向的内存地址变成另外一个int类型 j 的内存地址的时候,i 的值也不会发生改变。
#include <stdio.h>
#include <stdlib.h>
main()
{
int i = 3;
int* p = &i;
printf("i的值为:%d\n",i);
printf("p的值为:%#x\n",p); // 内存地址值一般是16进制, 占位符为:#x
// 修改i的值会不会改变p的值?
//i = 5;
//printf("修改i后i的值为:%d\n",i);
//printf("修改i后p的值为:%#x\n",p);
// 修改p的值会不会改变i的值?
int j = 4;
p = &j;
printf("修改p后i的值为:%d\n",i);
printf("修改p后p的值为:%#x\n",p);
system("pause");
}
* 号的三种含义:
乘法符号, 3*5
定义指针变量 int* p; 定义了一个名字为 p 的变量,能够存放int数据类型的地址
指针运算符;如果 p 是一个已经定义好的指针变量,则 *p 表示以 p 的内容为地址的变量
#include <stdio.h>
#include <stdlib.h>
main()
{
int i = 3;
int* p = &i;
*p; // 代表的是内存地址指向的值
printf("i的值为:%d\n",i);
printf("*p的值为:%#x\n",*p);
system("pause");
}
*p 表示以 p 的内容为地址的变量, 即 int 类型变量 i 的值。所以当 i 或者 *p 的值发生改变时,i 和 *p 会发生相同的改变.
#include <stdio.h>
#include <stdlib.h>
main()
{
int i = 3;
int* p = &i;
*p; // 代表的是内存地址指向的值
printf("i的值为:%d\n",i);
printf("*p的值为:%#x\n",*p);
//修改 *p 的值 i 的值会不会发生变化?
*p = 5;
printf("修改*p的值,i的值为:%d\n",i);
printf("修改*p的值,*p的值为:%#x\n",*p);
//修改 i 的值 *p 的值会不会发生变化?
i = 9;
printf("修改i的值,i的值为:%d\n",i);
printf("修改i的值,*p的值为:%#x\n",*p);
system("pause");
}
c 语言交换两个值:
在c语言中不能像java一样通过值传递来交换两个变量的值。需要通过指针类型来交换值。
#include <stdio.h>
#include <stdlib.h>
// 值传递, 不能通过值传递交换2个变量的值
swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
// 引用传递, 使用指针变量交换2个变量的值
swap2(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
main()
{
int x = 3;
int y = 5;
printf("x的值为%d,y的值为%d\n",x,y);
swap(x,y);
printf("使用值传递后:x的值为%d,y的值为%d\n",x,y);
swap2(&x,&y); // &x 拿到变量x 的指针变量
printf("使用指针后:x的值为%d,y的值为%d\n",x,y);
system("pause");
}
多级指针:
#include <stdio.h>
#include <stdlib.h>
main()
{
int i = 3;
int* p = &i;
int** q = &p;
int*** x = &q;
int**** y = &x;
printf("i的值为:%d\n",i);
printf("p的值为:%#x\n",p);
printf("q的值为:%#x\n",q);
printf("x的值为:%#x\n",x);
printf("y的值为:%#x\n\n",y);
printf("****y对应的值为:%d\n", ****y);
printf("***x对应的值为:%d\n", ***x);
printf("**q对应的值为:%d\n", **q);
printf("*p对应的值为:%d\n\n", *p);
//修改某个指针的地址指向的值
**q = 5;
printf("修改后的值,****y对应的值为:%d\n", ****y);
printf("修改后的值,***x对应的值为:%d\n", ***x);
printf("修改后的值,**q对应的值为:%d\n", **q);
printf("修改后的值,*p对应的值为:%d\n\n", *p);
system("pause");
}