C语言——深入理解指针(3)


在这里插入图片描述

1.字符指针变量

有两种使用方法:
1.存储字符的地址

#include<stdio.h>
int main()
{
	char a = 'A';
	char* pa = &a;
	printf("pa = %p\n", pa);
	return 0;
}

2.存储常量字符串的地址,指针变量存储的仅仅是字符串首元素的地址。

#include<stdio.h>
int main()
{
	char* pa = "I LOVE YOU!";
	printf("pa = %p\n", pa);
	return 0;
}

在C中会把常量字符串存储到单独的⼀块内存当中,如果有⼏个指针指向同⼀个字符串的时,他们实际上会指向同⼀块内存空间。但是⽤相同的常量字符串去初始化不同的数组时,就会开辟出不同的内存。

例如:《剑指offer》中的⼀道笔试题

#include <stdio.h>
int main()
{
 	 char str1[] = "hello world.";
 	 char str2[] = "hello world.";
	 const char *str3 = "hello world.";
	 const char *str4 = "hello world.";
 	if(str1 == str2)
 	{
 		printf("str1 and str2 are same\n");
 	}
 	else
 	{
 		printf("str1 and str2 are not same\n");
 	}
 	if(str3 == str4)
 	{
 		printf("str3 and str4 are same\n");
 	}
 	else
 	{
 		printf("str3 and str4 are not same\n");
 	}
 	
 return 0;
}

输出

str1 and str2 are not same
str3 and str4 are same

2.数组指针变量

深入理解指针(2)讲到了指针数组,是存放指针的数组
那数组指针,就是指向数组的指针了。

int arr[3] = {1,2,3};
int *p1[10] = {0};//指针数组
int(*p)[10] = &arr;
//数组指针,要加括号,因为[]优先级大于*
int (*p) [3] = &arr;
 | 	| 	|
 | 	| 	p指向数组的元素个数
 | 	p是数组指针变量名
 p指向的数组的元

在这里插入图片描述

C 运算符优先级表

在这里插入图片描述

3.⼆维数组传参的本质

在这里插入图片描述
整形一维数组的每个元素是整形元素,那么⼆维数组也可以看成是一个一维数组,只不过这个数组的每个元素是⼀维数组。数组传递参数的时候是传首元素地址,那二维数组传参是传第一个一维数组的地址,由前面所知,数组指针,所以形参可写成 int(*p)[5]来接收。

#include <stdio.h>
void test(int(*p)[5], int r, int c)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < r; i++)
    {
        for (j = 0; j < c; j++)
        {
            printf("%d ", *(*(p + i) + j));
        }
        printf("\n");
    }
}
int main()
{
    int arr[5][5] = { {1,2,3,4,5}, {1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5} };
    test(arr, 5, 5);
    return 0;
}

4.函数指针变量

函数指针变量是⽤来存放函数地址的,未来通过地址能够调⽤函数。
先输出一波函数地址

#include <stdio.h>
int add(int a, int b)
{
    return a + b;
}

int main()
{
    int a = 10; 
    int b = 20;
    printf("&add = %p\n", add);
    printf("&add = %p\n", &add);
    return 0;
}

输出:

&add = 003A1023
&add = 003A1023

要将函数的地址存放起来,就得创建函数指针变量

int (*p) (int a,int b) ——函数参数列表
|     |
|		函数指针变量名
函数返回类型
#include <stdio.h>
int add(int a, int b)
{
    return a + b;
}

int main()
{
    int a = 10; 
    int b = 20;
    int (*p)(int a, int b) = &add;
    printf("add(a,b) = %d\n", add(a,b));
    printf("p(a,b)   = %d\n", p(a,b));
    return 0;
}

输出:

add(a, b) = 30
p(a, b) = 30

5. 函数指针数组

把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组
定义

int (*p[3])(); 
p先和[]结合,成为数组,
数组的内容int (*)()类型的函数指针
不能这样写 int (*)() p[3];会报错的

在这里插入图片描述

6.转移表

利用函数指针数组实现:简单计算器

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//加
int add(int a, int b)
{
    return a + b;
}
//减
int sub(int a, int b)
{
    return a - b;
}
//乘
int mul(int a, int b)
{
    return a * b;

}
//除
int div(int a, int b)
{
    return a / b;
}
//取余数
int rem(int a, int b)
{
    return a % b;
}

int main()
{
    int n = 0;
    int (*p[5])(int a, int b) = { add,sub,mul,div,rem };
    while(1)
    {
        printf("-----------计算器----------\n");
        printf("---------1.加法 2.减-------\n");
        printf("---------3.乘法 4.除-------\n");
        printf("---------5.取余 0.退出-----\n");
        printf("----------请输入:---------\n");
       
        scanf("%d", &n);
        if (n == 0)
        {
            break;
        }
        else
        {
            printf("请输入两个整数:\n");
            int a = 0;
            int b = 0;
            scanf("%d%d", &a, &b);
            printf("输出结果: %d\n", p[n - 1](a, b));
        }
        
    } 
    return 0;
}

有点意思。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是无敌小恐龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值