|
楼主 |
发表于 2019-6-11 19:05:46
|
显示全部楼层
本帖最后由 bin554385863 于 2019-6-12 22:30 编辑
指针的一些复杂说明:
int p; -- 这是一个普通的整型变量
int *p; -- 首先从 p 处开始,先与*结合,所以说明 p 是一个指针, 然后再与 int 结合, 说明指针所指向的内容的类型为 int 型。所以 p 是一个返回整型数据的指针。
int p[3] -- 首先从 p 处开始,先与[] 结合,说明 p 是一个数组, 然后与 int 结合, 说明数组里的元素是整型的, 所以 p 是一个由整型数据组成的数组。
int *p[3]; -- 首先从 p 处开始, 先与 [] 结合, 因为其优先级比 * 高,所以 p 是一个数组, 然后再与 * 结合, 说明数组里的元素是指针类型, 然后再与 int 结合, 说明指针所指向的内容的类型是整型的, 所以 p 是一个由返回整型数据的指针所组成的数组。
int (*p)[3]; -- 首先从 p 处开始, 先与 * 结合,说明 p 是一个指针然后再与 [] 结合(与"()"这步可以忽略,只是为了改变优先级), 说明指针所指向的内容是一个数组, 然后再与int 结合, 说明数组里的元素是整型的。所以 p 是一个指向由整型数据组成的数组的指针。
int **p; -- 首先从 p 开始, 先与 * 结合, 说是 p 是一个指针, 然后再与 * 结合, 说明指针所指向的元素是指针, 然后再与 int 结合, 说明该指针所指向的元素是整型数据。由于二级指针以及更高级的指针极少用在复杂的类型中, 所以后面更复杂的类型我们就不考虑多级指针了, 最多只考虑一级指针。
int p(int); -- 从 p 处起,先与 () 结合, 说明 p 是一个函数, 然后进入 () 里分析, 说明该函数有一个整型变量的参数, 然后再与外面的 int 结合, 说明函数的返回值是一个整型数据。
int (*p)(int); -- 从 p 处开始, 先与指针结合, 说明 p 是一个指针, 然后与()结合, 说明指针指向的是一个函数, 然后再与()里的 int 结合, 说明函数有一个int 型的参数, 再与最外层的 int 结合, 说明函数的返回类型是整型, 所以 p 是一个指向有一个整型参数且返回类型为整型的函数的指针。
int *(*p(int))[3]; -- 可以先跳过, 不看这个类型, 过于复杂从 p 开始,先与 () 结合, 说明 p 是一个函数, 然后进入 () 里面, 与 int 结合, 说明函数有一个整型变量参数, 然后再与外面的 * 结合, 说明函数返回的是一个指针, 然后到最外面一层, 先与[]结合, 说明返回的指针指向的是一个数组, 然后再与 * 结合, 说明数组里的元素是指针, 然后再与 int 结合, 说明指针指向的内容是整型数据。所以 p 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。
2019年6月11日19:03:54
指针与函数
[1]
指针作为函数的参数#include <stdio.h>
void swap(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
int main()
{
int a = 20, b = 100;
int *i, *j;
i = &a;
j = &b;
printf("交换前\na = %d b = %d\n", a, b);
swap(i, j); //等效于swap(&a, &b)
printf("交换后\na = %d b = %d\n", a, b);
return 0;
}
----------------------------------------------------------------------------------------------------------------
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-nwo3ppih.t3q --stdout=Microsoft-MIEngine-Out-orc5bl0n.fz5 --stderr=Microsoft-MIEngine-Error-umt0mwel.xzb --pid=Microsoft-MIEngine-Pid-4wxeuray.ng4 --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
交换前
a = 20 b = 100
交换后
a = 100 b = 20
E:\Administrator\Documents\My C>
================================================================
[2]
指针作为函数的返回值:#include <stdio.h>
char* search(char *str, char c)
{
char *p = str;
while (*p != '\0')
{
if (*p == c)
{
return p;
}
p++;
}
return NULL;
}
int main()
{
char *stra = "this is a test text", *j;
char m;
int a;
printf("请输入查找的字符:");
m = getchar();
j = search(stra, m);
a = (j - stra) +1;
printf("%c在字符串的第%d个位置", m, a );
return 0;
}
-----------------------------------------------------------------------------------------------------
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-m0mcz5ks.sc0 --stdout=Microsoft-MIEngine-Out-drfpigtq.m3m --stderr=Microsoft-MIEngine-Error-h2uync3s.5l3 --pid=Microsoft-MIEngine-Pid-fpsjec0r.ilc --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
请输入查找的字符:a
a在字符串的第9个位置
E:\Administrator\Documents\My C>
===================================================================================
[3]
函数指针
函数指针是指向函数的指针变量。
通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。
函数指针可以像一般函数一样,用于调用函数、传递参数。
函数指针变量的声明:typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型
通过函数指针实现函数调用函数#include <stdio.h>
int max(int a, int b)
{
return a+b;
}
int min(int a, int b)
{
return a - b;
}
int sum(int (*p)(int a, int b), int (*k)(int a, int b), int a, int b)//函数指针作为函数的参数;
{
return (*p)(a, b)+(*k)(a, b);
}
int main()
{
int m = 5, n = 10, c;
c = sum(max, min, m, n);//将函数名传递给指针;
printf("%d", c);
return 0;
}
---------------------------------------------------------------------------------
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-oyt2e01i.jib --stdout=Microsoft-MIEngine-Out-bzv1bnmt.dpl --stderr=Microsoft-MIEngine-Error-tjrk4xtk.5s5 --pid=Microsoft-MIEngine-Pid-ussezm2z.aph --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
10
E:\Administrator\Documents\My C>
============================================================== |
|