关于数组、指针、数组指针、指针数组、函数指针,函数指针数组的代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//一级指针int *p
//二级指针int *p
//指针和数组char
arr="abcdef"
//char arr[] = { "abcdef" }

//指针数组int arr[9]={0};
//数组指针 int(
P)[9] 一个指向9个整型元素数组的指针

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 ab; }
int div(int a, int b)
{ return a / b; }
int main()
{
int x, y;
int input = 1;
int ret = 0;
int(
p[5])(int x, int y) = { 0, add, sub, mul, div }; //函数指针数组,数组中放的是函数名,即函数的首地址
//转移表 while (input)
{ printf( "\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "
\n" );
printf( "请选择:" );
scanf( "%d", &input);
if ((input <= 4 && input >= 1))
{ printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = (*p[input])(x, y); }
else
printf( "输入有误\n" );
printf( "ret = %d\n", ret);
}
return 0;
}

void test(const char str)
{ printf("%s\n", str); }
int main()
{ //函数指针pfun void (
pfun)(const char*) = test; //函数指针的数组pfunAr

void(*pfunArr[5])(const char* str);//函数指针数组,数组里放的是函数指针,
pfunArr[0] = test; //数组中第一个元素等价于函数名(函数的首地址)
//指向函数指针数组pfunArr的指针ppfunArr  void (*(*ppfunArr)[10])(const char*) = &pfunArr;  
return 0;

}

void print_arr1(int arr[3][5], int row, int col)
{
int i = 0;
int j=0;
for (i = 0; i<row; i++)
{
for (j = 0; j<col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void print_arr2(int(*arr)[5], int row, int col)//数组指针来接受,数组名表示数组首元素是一位数组的地址
{ int i = 0;
int j = 0;
for (i = 0; i<row; i++)
{
for (j = 0; j<col; j++)
{ printf("%d ", arr[i][j]); }
printf("\n");
}
}
int main()
{
int arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
print_arr1(arr, 3, 5);
//数组名arr,表示首元素的地址
//但是二维数组的首元素是二维数组的第一行 //所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址 //可以数组指针来接收
print_arr2(arr, 3, 5);
return 0;
}

int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
char str3 = "hello bit.";
char
str4 = "hello bit.";//指针变量在栈帧 字符串在字符常量区 两个指针指的都是h的地址

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;

}

void test(int ptr)//二级指针ptr
{
printf("num = %d\n",
ptr);
}
int main()
{
int n = 10;
int *p = &n; //p指向n的地址 pp指向p的地址 p解引用是n pp解引用是p
int **pp = &p;
test(pp);
test(&p);
return 0;
}

void test(char *p)
{ }
int main()
{
char c = 'b';
char
pc = &c;
char*ppc = &pc;
char
arr[10];
test(&pc);
test(ppc);

//void print(int p, int sz)//p指向数组首元素的地址
//{
// int i = 0;
//for (i = 0; i<sz; i++)
//{ printf("%d\n",
(p + i)); }
//}
//int main()
//{
// int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };//未被初始化的默认为0
// int *p = arr;
// int sz = sizeof(arr) / sizeof(arr[0]);
// print(p, sz);
// system("pause");
// return 0;
//}

转载于:https://blog.51cto.com/14232658/2393917

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值