目录

一、地址与指针的基本使用

地址输出代码示例:

指针的定义代码示例:

指针的使用(解引用):

空指针的定义及指针间的地址存储代码示例:

#[ ]的解引用操作

###注意事项: 

 二、指针和函数的运用

1.形参类型为指针类型的代码示例:

2.函数返回值类型为指针类型的代码示例:

2.解决方法(用static关键字创建局部静态变量,延长生命周期):

3.数组传参的代码示例:

 三、指针和数组

指针指向数组元素

 1.数组指针解引用调用代码示例:

2.强转用自己的想法去操作内存代码示例:

3.常量指针代码示例:

4.指针常量代码示例:


一、地址与指针的基本使用

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]

    ###注意事项: 

  1. 指针是一个变量,有自己的内存不管是什么类型的指针都要占4个字符的大小(地址都是使用数字来保存的)
  2. 不能对一个空指针(指针没有保存任何地址)进行解引用操作

 二、指针和函数的运用

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;
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐