C语言-11-指针1

本文详细介绍了C语言中的指针概念,包括指针变量的定义、赋值、引用以及指针与数组、字符串和函数的交互。通过实例展示了如何使用指针进行数组元素的访问、字符串的输出以及通过指针调用函数和交换变量值。此外,还探讨了指针函数和函数指针的应用,加深了对C语言指针理解。
摘要由CSDN通过智能技术生成

指针入门到精通

1.指针是什么

区分指针与指针变量的概念
//指针变量定义
//类型 *指针变量名
//如:int *pointer_1,*pointer_2;
//int a,b;
//int *pointer_1=&a,*pointer_2=&b;
//引用指针变量:
//1.给指针变量赋值:如:p=&a;(使p指向a);
//2.引用指针变量指向的变量:p=&a;*p=1;(*p相当于1)
//3.引用指针变量的值。
//熟练掌握两个有关运算符
//& 取地址运算符
//* 指针运算符("间接访问"运算符);

#include <stdio.h>

int main()
{
	int i = 5, j = 9, k;

	printf("\ni=%p,j=%p,k=%p\n\n", &i, &j, &k);


	int *i_pointer = &i;//将i变量的地址赋给指针变量i_pointer
	printf("\ni_pointer=%p,i_pointer=%d\n\n", &i_pointer, *i_pointer);

	return 0;
}

#include <stdio.h>

int main()
{
	int k;
	int *pk = &k;
	*pk = 300;
	printf("k=%d", k);//输出结果k=300;

	return 0;
}
//编程案例:请输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数
//解题思路:
//定义一个函数,将指向两个整型变量的指针作为实参传递给该函数的形参指针变量,在函数中通过指针实现交换两个变量的值。
#include <stdio.h>

void swap(int* px, int* py)
{
	int temp;
	temp = *px;
	*px = *py;
	*py = temp;

}
int main()
{
	int a, b;
	int* pa, * pb;
	printf("请输入两个整数(a,b):");
	scanf_s("%d,%d", &a, &b);

	pa = &a;
	pb = &b;
	if (a < b)
		swap(pa, pb);
	printf("max=%d,min=%d", a, b);


	return 0;
}

2. 指针引用数组

//在引用数组元素时指针的运算
//加一个整数(+/+=):p+1
//减一个整数(-/-=):p-1
//自加运算:p++,++p
//自减运算:p--,--p
//两个指针相减,p1-p2(只有P1和p2都指向同一数组中的元素时才有意义)

//通过指针引用数组元素
//1.下标法:a[i]
//2.指针法:*(a+i)/*(p+i)
//其中a是数组名,p是指向数组元素的指针变量,其初值p=a

#include <stdio.h>

int main()
{
	int a[10] = { 1,3,5,7,9,11,13,15,17,19 };
	int *pa = a;//将数组首地址给指针变量pa;

	//下标法
	for (int i = 0; i < 10; i++)
		printf("%4d", a[i]);
	printf("\n");

	//指针法1
	for (int i = 0; i < 10; i++)
		printf("%4d", *(pa + i));
	printf("\n");

	//指针法2
	for (int i = 0; i < 10; i++)
		printf("%4d", *(a + i));
	printf("\n");



	return 0;
}

//用数组名作函数参数
//用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该时一个指针变量。C编译都是将形参数组名作为指针变量来处理的

//通过指针引用多维数组

3.指针引用字符串

//指针引用字符串
//字符串是存放在字符数组中的,引用一个字符串,可以有以下两种方法:
//1.通过数组名和格式声明"%s"输出该字符串,也可通过数组名和下标引用字符串中的一个字符
//2.通过字符指针变量引用字符串常量。

//编程:定义一个字符数组,在其中存放字符串"I Love China!",输出该字符串和第8个字符
//思路:定义字符数组string,对它初始化,由于初始化时字符的个数是确定的,因此可不必指定数组的长度。用数组名string和输出格式%s可以输出整个字符串。用数组名和下标可以引用任一数组元素

#include <stdio.h>

int main()
{
	char str[50] = "I Love China!";
	printf("str=%s\n", str);

	char *pstr = "I Love China!";
	printf("str=%s\n", pstr);

	return 0;
}

4.指针函数与函数指针

//指针函数:带指针的函数,函数返回类型是某一类型的指针
#include <stdio.h>

int *GetDateFunc(int week, int day)
{
	static int cale[5][7] =
	{
	{1,2,3,4,5,6,7},
	{8,9,10,11,12,13,14},
	{15,16,17,18,19,20,21},
	{22,23,24,25,26,27,28},
	{29,30,31,-1}
	};
	return &cale[week - 1][day - 1];
}

int main()
{
	int wk, dy;
	do
	{
		printf("请输入week(1-5),day(1-7):");
		scanf_s("%d,%d", &wk, &dy);
	} while (wk < 1 || wk>5 || dy < 1 || dy>7);
	printf("%d\n\n", *GetDateFunc(wk, dy));

	return 0;
}

//函数指针:指向函数的指针变量
#include <stdio.h>
void(*pfunc)();

void a()
{
	printf("调用函数a().\n\n");
}
void b()
{
	printf("调用函数b().\n\n");
}

int main()
{
	pfunc = a;
	(*pfunc)();

	pfunc = b;
	(*pfunc)();

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值