关于指针数组和二维数组的区别&&抽签小程序

之前人家写的抽签小程序都是要设置随机变量,第一先设置srand()种子,第二令number=rand();我觉得既然是伪随机,不如让我通过键盘控制好了;

#include <stdio.h>
#include <conio.h> 
int main(){ 
   char *pre[]={"a","b","c","d","e","f"};
   while(!kbhit()){ //该函数主要检测是否按下一键,若按下返回0,没有按返回1值。
      printf("%s\r",*(pre+i));
      i=(i+1)%6;     
}

在Dev上运行时,pre里的字符会滚动显示。按下任意一键后开始,再次按下后暂停。上一段代码运行成功;
可是当我的代码调整一下,编译出错。
[Error] lvalue required as increment operand

int main(){ 
   char *pre[]={"a","b","c","d","e","f"};
   while(!kbhit()){ //该函数主要检测是否按下一键,若按下返回0,没有按返回1值。
      printf("%s\r",*(pre));
      pre=(pre+1)%6;  //错误点

原因为*pre[]表示指针数组,实际上是一个数组,pre表示数组头,而数组头是不能进行运算操作的。

那么如果想通过指针来访问二维数组中得每一行,我们可以先建立一个二维数组,在建立一个二维数组指针。那么二维数组头赋值给二维数组指针就可以利用指针遍历二维数组了。代码修改后如下:

char a[][6]={"aa","bb","cc","dd","ee","ff"}; 
char (*pr)[6];
pr=a;
printf("%s\r",*(pr));
printf("%s\r",*(pr+1));

这样输出的是aa和bb;

这里通过c语言中文网上的解释再次强化下知识点:
指针数组和二维数组指针在定义时非常相似,只是括号的位置不同:

int *(p1[5]);  //指针数组,可以去掉括号直接写作 int *p1[5];
int (*p2)[5];  //二维数组指针,不能去掉括号

指针数组和二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的 p1 为例,在32位环境下它占用 4×5 = 20 个字节的内存。二维数组指针是一个指针,它指向一个二维数组,以上面的 p2 为例,它占用 4 个字节的内存。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值