指针基础(Num011)
int *p1;p1 = &a;char *p2;p2 = &b;getchar();getchar();return 0;指针的作用是用来保存一个地址的定义的指针是分类型的,指针的类型是在定义指针的时候带上*int main()int a = 10;//定义指针的时候初始化为NULLif (p1!= NULL)//使用指针之前判断指针非空,然后使用(即空指针不能解引用)*p1 = 10;p1 =
目录
2.解决方法(用static关键字创建局部静态变量,延长生命周期):
一、地址与指针的基本使用
1.什么是地址和指针?
所谓的地址和指针,就是内存中的地址编号
如:int a=10; printf(“%p\n”,&a);
//'&'是取址符,这里的&a是取变量a的地址,以%o的格式输出地址
2.地址
系统在编译代码时会给一个变量分配内存地址,此地址就称为变量的“指针”,分配完成后,这个地址是固定的,是无法被改变的,所以又称为指针常量。数组的地址也是指针常量(也称为地址常量)
地址输出代码示例:
#include<stdio.h>
int main() {
int a = 10;
//可以看到局部变量每次生成的地址都是不一样的
printf("%x\n", &a);
//数组名可以表示数组的首地址
char arr[] = "ABCDEF";
printf("%x\n", arr);
getchar();
getchar();
return 0;
}
-
可以在调试的内存窗口通过地址找到它
指针的定义代码示例:
#include<stdio.h>
int main()
{
int a = 10;
char b = 'A';
int *p1;
p1 = &a;
char *p2;
p2 = &b;
getchar();
getchar();
return 0;
}
-
指针的作用是用来保存一个地址的
-
定义的指针是分类型的,指针的类型是在定义指针的时候带上*
指针的使用(解引用):
#include<stdio.h>
int main()
{
int a = 10;
char b = 'A';
//定义一个int*类型的指针并指向a的地址
int* p1;
p1 = &a;
//调用指针p中存放的a的地址存放的元素 给它赋值为 666
*p1 = 666;
//变量a目前的值
printf("%d\n", a);
//指针的大小
printf("%d\n", sizeof(p1));
//指针p1的地址
printf("%x\n", &p1);
getchar();
getchar();
return 0;
}
-
通过指针保存一个变量的地址,然后通过指针直接去使用变量
-
解引用指针:*指针:返回这个指针所保存的地址上面的元素
空指针的定义及指针间的地址存储代码示例:
#include<stdio.h>
int main()
{
int a = 10;
char b = 'A';
int* p1 = NULL;//定义指针的时候初始化为NULL
int* p5 = NULL;
if (p1 != NULL)//使用指针之前判断指针非空,然后使用(即空指针不能解引用)
*p1 = 10;
p1 = &a;
p5 = p1;
*p5 = 666;//会修改a的变量
printf("%d\n", a);
getchar();
getchar();
return 0;
}
-
#[ ]的解引用操作
- //*(p+1)等价p[1]
- //*(p+n)等价p[n]
###注意事项:
- 指针是一个变量,有自己的内存不管是什么类型的指针都要占4个字符的大小(地址都是使用数字来保存的)
- 不能对一个空指针(指针没有保存任何地址)进行解引用操作
二、指针和函数的运用
1.形参类型为指针类型的代码示例:
#include<stdio.h>
//形参是实参的拷贝,这里传输的是地址,对地址解引用,所以会值会改变
void fun(int* x, int* y)
{
*x = 100;
*y = 200;
}
int main()
{
int a = 10;
int b = 20;
fun(&a,&b);
printf("%d %d\n", a, b);
getchar();
getchar();
return 0;
}
2.函数返回值类型为指针类型的代码示例:
#include<stdio.h>
int* fun2()
{
int a = 10;
return &a;
}
int main()
{
//该赋值可以找到局部变量a的地址,但是a的生命周期调用完就已结束
int* p = fun2();
printf("%d\n",*p);//第一次输出为编译器的自动优化
printf("%d\n",*p);//第二次会输出未知的值
getchar();
getchar();
return 0;
}
2.解决方法(用static关键字创建局部静态变量,延长生命周期):
#include<stdio.h>
int* fun2()
{
static int a = 10;
return &a;
}
int main()
{
//该赋值可以找到局部变量a的地址,但是a的生命周期调用完就已结束
int* p = fun2();
printf("%d\n",*p);//第一次输出为编译器的自动优化
printf("%d\n",*p);//第二次会输出未知的值
getchar();
getchar();
return 0;
}
3.数组传参的代码示例:
#include<stdio.h>
void fun3(int *arr)//或者这样arr[],函数中把arr当数组使用就可以
{
for (int i = 0; i < 10; i++)
{
arr[i] = 0;
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
fun3(arr);
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
getchar();
getchar();
return 0;
}
三、指针和数组
指针指向数组元素
1、数组元素的地址
既然变量有地址,那么数组元素有地址吗?
如:int a[10] = [0,1,2,3,4,5,6,7,8,9},*p;
&a[0]://引用数组元素a[0]的地址
2、指针指向数组元素
p=&a[1]://指针变量p指向数组元素a[1]的地址
p=a;//指针变量p指向数组a的首地址,也就是数组第一个元素的地址
1.数组指针解引用调用代码示例:
#include<stdio.h>
int main()
{
int arr[10] = { 2,6,8,4,1,5,3,9,7,10 };
int* p = arr;//或者使用数组第一个元素的地址表示arr[0]
printf("%d %d",*p,*(p+1));//+1 移动4个字节
//一个int*类型的指针,在解引用时会访问指针所保存的地址往后四个字节的内容
//并且以int类型的方式看待上面的数据
getchar();
getchar();
return 0;
}
2.强转用自己的想法去操作内存代码示例:
#include<stdio.h>
#include<string.h>
int main()
{
//指针强转来操作内存
//可以通过强转来用自己的想法去访问内存
int arr[10] = { 0 };
int* p = arr;
*p = 100;
*(float*)(p + 1) = 12.34f;
strcpy(((char*)p) + 8, "ABCDEFG");
getchar();
getchar();
return 0;
}
3.常量指针代码示例:
#include<stdio.h>
int main()
{
//使用const char*类型的指针指向一个常量字符串
const char* p = "123456";//加上const
//*p = 'A';//错误不修改执行的内容
//常量指针指向的内容不能被修改
p = "ABCDEFG";//正确,可以改变指针指向
getchar();
getchar();
return 0;
}
4.指针常量代码示例:
#include<stdio.h>
int main()
{
//常量指针 指的是 指向的内容是一个常量
//指针常量 指的是 指针是一个常量
int a = 10;
int b = 20;
int* const p = &a;
*p = 666;//指向的内容可以修改
//p = &b;//不能改变指向
getchar();
getchar();
return 0;
}
更多推荐
所有评论(0)