认识指针
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 5, j = 10, k;
printf("i的地址为:%d\n", &i);
int* p = &i;
printf("%d, %d, %d\n", &p, *p, p);//&p表示指针p本来的地址,*p表示解引用,取出所指向地址存储的值,p代表的所赋值给的地址也就是i
int abs = 10;
printf("abs=%d\n", abs);
int* point = &abs;
*point = 100;//直接对内存里的值进行修改
printf("abs=%d\n", abs);
}
用指针指向数组
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int arr[10] = { 1, 3, 5, 7, 10, 12, 18, 20, 90, 100 };
int main()
{
int* pa = arr;
for (int i = 0; i < 10; i++)
{
printf("%4d ", *(pa + i));//因为数组的地址是连续的,所以加1就代表四个字节
}
printf("\n");
return 0;
}
用数组名作函数参数
用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量。C编译都是将形参数组名作为指针变量来处理的。
![](https://img-blog.csdnimg.cn/direct/e1747f082f8f49758031554451928cc7.png)
通过指针引用多维数组
![](https://img-blog.csdnimg.cn/direct/d296dfd5114f46b48c604b820e39ccaa.png)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int arr[2][3] = { {1, 2, 3}, {4, 5, 6} };
// 指向二维数组的指针
int(*ptr)[3] = arr;//声明指向一个三个元素的数组地址
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
// 使用指针访问数组元素
printf("%d ", *(*(ptr + i) + j));
}
printf("\n");
}
return 0;
}
指针函数与函数指针
指针函数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int* getcalc(int week, int day)
{
int c[2][3] = {{5, 2, 7}, {6, 9 ,10}};
return &c[week - 1][day - 1];
}
int main() {
int* ptr;
int wk, dk;
scanf("%d%d", &wk, &dk);
ptr = getcalc(wk, dk);
printf("%d", *ptr);
return 0;
}
函数指针
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void (*func)();
void a()
{
printf("调用函数a\n");
}
void b()
{
printf("调用函数b\n");
}
void c()
{
printf("调用函数c\n");
}
int main()
{
func = a;
func();
func = b;
func();
func = c;
func();
return 0;
}