汉扬编程 编程大纲 C|数组、等价的指针及用做函数的形参与实参

C|数组、等价的指针及用做函数的形参与实参

在C中,除标识符以外,有时候还必须定义”类型”。

C|数组、等价的指针及用做函数的形参与实参

具体来说,遇到以下情况需定义”类型":

I 在强制转型运算符中

II 类型作为sizeof 运算符的操作数

比如,将强制转型运算符写成下面这样:

(int*)

这里指定"int*" 为类型名。

从标识符的声明中,将标识符取出后,剩下的部分自然就是类型名。

int hoge; 类型是:int

int *hoge; 类型是:int *

double(*p)[3]; 类型是:double(*)[3]

void(*func)(); 类型是:void(*)()

对于C语言来说,类型必须保存一致性,否则必须做隐式或显式类型转换;

I 参与运算的操作数;

II 在赋值表达式中,右值的类型须与左值的类型保持一致;

III 对于函数的形参与实参,实参的类型须与形参的类型保持一致;

1 指针的类型从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:

(1) int*ptr; //指针的类型是int*(2) char*ptr; //指针的类型是char*(3) int**ptr; //指针的类型是int**(4) int(*ptr)[3]; //指针的类型是int(*)[3](5) int*(*ptr)[4]; //指针的类型是int*(*)[4]怎么样?找出指针的类型的方法是不是很简单?

2 指针所指向的类型当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

例如:

(1)int*ptr; //指针所指向的类型是int(2)char*ptr; //指针所指向的类型是char(3)int**ptr; //指针所指向的类型是int*(4)int(*ptr)[3]; //指针所指向的类型是int()[3](5)int*(*ptr)[4]; //指针所指向的类型是int*()[4]3 数组的类型如多维数组int arr[3][4][5]是什么类型呢?如果用arr做右值,左值的类型是什么呢?

对于数组名,其逻辑含义是数组首元素的地址,逻辑上等于&arr[0]。

arr[]指向一个二维数组arr[4][5], 所以其类型是一个特定指针,一个指向一个二维数组arr[4][5]的指针,其类型是int (*)[4][5]。

int (*arrp)[4][5] = arr;

4 数组、等价的指针及用做函数的形参与实参

5 实例#include <iostream>using namespace std;void f1(int* p1, int n){} // 1 一维数组与一级指针void f2(int(*p3)[4], int n){} // 2 二维数组与数组指针void f3(char** p5, int n){} // 3 指针数组与二级指针void f4(char* pv1){} // 4 一级指针的“己”和“他”void f5(char** pv2){}void f6(char** pv3){} // 5 二级指针的“己”和“他”void f7(char*** pv4){}void func(int, int){} // 6 函数与函数指针void f8(void(*fp)(int,int)){}int main(){ // 1 一维数组与一级指针 int arr1[4]; int* p1 = arr1; f1(arr1,4); int(*p2)[4] = &arr1; // 2 二维数组与数组指针 int arr2[3][4]; int(*p3)[4] = arr2; f2(arr2,3); int(*p4)[3][4] = &arr2; // 3 指针数组与二级指针 char* argv[3]; char** p5 = argv; f3(argv,3); // 4 一级指针的“己”和“他” char* p6; char* pv1 = p6; f4(p6); char** pv2 = &p6; f5(&p6); // 5 二级指针的“己”和“他” char** pp; char** pv3 = pp; f6(pp); char*** pv4 = &pp; f7(&pp); // 6 函数与函数指针 void(*fp)(int,int) = func; f8(func); // 以上变量定义在函数调用前自然要初始化或赋值 // 为简单起见,省略了这一操作,只是为了演示类型一致性 while(1); return 0;}-End-

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6105.html

「C与指针心得」4.左移右移操作

让你不再害怕指针——C指针详解(经典,非常详细)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部