二维数组用一维数组和二维数组表示输出的为什么是地址

欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 140 人关注过本帖
标题:调用函数写的是一维数组,如果传递的是二维数组,怎么调用?
等 级:新手上路
帖 子:27
结帖率:66.67%
&&已结贴√
&&问题点数:14&&回复次数:13&&&
调用函数写的是一维数组,如果传递的是二维数组,怎么调用?
例如函数 void&&sw(int a[],int n);
int b[2][3];}
数组b怎么传递到函数中??
感谢指导。
等 级:新手上路
帖 子:27
谢谢老师们指导
等 级:新手上路
帖 子:27
等 级:新手上路
帖 子:27
等 级:版主
帖 子:1170
专家分:3896
fun(int a[][10],int m,int n)~
[code]/*越来越觉得C论坛像随意闲聊了~无聊灌下水~2017更~*/[/code]
等 级:新手上路
帖 子:27
回复 5楼 九转星河
不好意思啊,大神,直接填个空呗
int findmax(int a[],int n);
{int a[8]={8,3,9,4,7,12,6,10},b[2][3]={32,11,15,7,9,4},ma,
&&& ma=findmax(a,8);
&&& mb=findmax(&&&&&&,6);
&&& if (ma&mb)
&&&&&&&&printf(&array a & array b\n&);
&&&&&&&&printf(&array b &array a\n&);
等 级:版主
帖 子:1170
专家分:3896
b[0]~~~~~~~~~~~~~~
[code]/*越来越觉得C论坛像随意闲聊了~无聊灌下水~2017更~*/[/code]
等 级:版主
帖 子:1170
专家分:3896
二维数组储存的地址是连续的~~~~~
[code]/*越来越觉得C论坛像随意闲聊了~无聊灌下水~2017更~*/[/code]
等 级:新手上路
帖 子:27
回复 8楼 九转星河
等 级:新手上路
帖 子:27
b[2]也可以吧
版权所有,并保留所有权利。
Powered by , Processed in 0.024302 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights ReservedC语言的数组(第一篇章:一维数组) - 简书
C语言的数组(第一篇章:一维数组)
数组的定义:
数组表示的是一组数据类型相同的数,这组数当中的每一个元素都是一个独立变量,数组就是用来存储和处理一组相同类型的数据的。必须牢牢记住:数组的三要素为数组的起始地址、范围和类型大小。
数组名,是数组的唯一标识符。
数组主要分一维数组和二维数组来学习,而多维数组其实是没有的,说句不好听的,数组学的就是一维数组。因为它们都是一维数组来铺垫的。&1&一维数组的定义:
一维数组定义的一般形式为: 类型说明符 数组名[常量表达式];
&2&一维数组的存储:
一维数组,在内存中是一段连续的存储区域 。
使用code数组存储上节中建立的数据表中的序号列中的数据,如下表所示 :
Paste_Image.png
特别注意一点:在C语言当中,数组的下标总是从0开始记的,而不是从1开始。这一点大家需要格外注意,特别是最初接触到数组。至于为什么从0开始,通过汇编语言我们可以知道[ ] 是一种基址变址运算符。因此数组的下标从0 处开始是由于存放数据基于起始位置偏移的是0 个单位处的。&3&一维数组的初始化:
初始化有两种方式:
a、先定义数组,再进行初始化。
b、在定义的同时对其初始化。
初始化的情况分为五种:不初始化、全初始化、部分初始化、满实始化和不指定大小实始化 。(比较简单,这里就不一一细说。)
但要注意的是在定义数组时如果没有定义数组元素的个数,使用时就会发生异常,原因是内存中并没有为数组array开辟任何存储空间,数据自然无处存放。&4&一维数组元素的操作
写个小程序吧。
#include&stdio.h&
int main(void)
int array[5]={1,2,3,4,5}; //定义数组,同时初始化
for(i=0;i&5;i++)
//循环访问数组元素
printf("a[i] = %d\n",array[i]);
//输出结果是
具体的就不多说了。说一下注意事项咯。在调用函数时,变量是按照传值方式传递的,而数组是按照传地址方式传递的。跟变量不一样,对于变量,实参可以改变形参,形参的改变不会影响到实参;对于数组,实参可以改变形参,形参的改变也会改变实参。来自我的博客:1.N个整数的排序。 (1)要求 1)用一个数组存放各个整数 2)在主函数main()中实现数据的输入和输出操作,并用一个函数实现对数组元素的排序操作。 3)排序函数为swap(inta[], intsize); (size为数组的长度)
算法如下: 第一步:从键盘输入5个int数; 第二步:输出这五个数表示数已经被输入 第三步:调用排序算法(swap函数)对这5个数进行排序,并且输出这个5个排好序的数
以下是程序源代码加注释:
# include "iostream" # include "cmath" //头文件 void swap(int a[], int size);//排序函数声明
int *array= new int[5];//全局变量
void main() {
//动态分配内存空间
cout<<"pleaseinput 5 nums int :"<<
for(i=0;i<5;i++)
cin>>array[i];//从键盘输入5个数
cout<<"thereare 5 nums you inputed!!:"<<
for(i=0;i<5;i++)
cout<<array[i]<<" ";
}//输出输入的五个数
swap(array,5);//进行排序
for(i=0;i<5;i++)
cout<<array[i]<<" ";
}//输出排好序的5个数 } void swap(int a[], int size)//排序函数 {
for(j=i+1;j
if(a[i]//判断是否大于
a[i]= a[i] + a[j];
a[j]= a[i] - a[j];
a[i]= a[i] - a[j];//交换
} } 运行结果:
心得: 在排序算法中,冒泡法,选择法,插入法,快速法,shell法用的比较多,其中冒泡法中还有一种叫做沉底法的排序方法,在小程序中,这些排序方法大同小异,而当排序元素非常多的时候,百度一个快速法排序能节约很多时间。。。 参考资料:http://blog.csdn.net/xdw1985829/article/details/6699224
2.输入一个n×n的矩阵,求出两条对角线元素值之和以及输出矩阵中最大值和最小值的下标。
算法如下: 1.先从键盘输入数组的大小N。 2.使用随机值给数组元素赋值。 3.调用函数_angelAdd1(int **p),_angelAdd2(int **p)来求对角线元素的值。 4.调用 trixMax(int **p)来求最大值元素的下标。 5.调用 trixMin(int **p)来求最小值元素的下标。 6.输出对应的值。
代码如下:
#include #include #include
int N = 0;//全局变量N,用于存储数组的大小 //函数原型声明 voidiniTrix(int **p); int_angelAdd1(int **p); int_angelAdd2(int **p); int*trixMax(int **p); int*trixMin(int **p); void _output(int**p);
intmain() {
int i=0;//分配数组地址时用到的循环标志
int flag=0;//switch的使用标志
int *a;//用于装返回的下标的两个数
cout<<"how big the trixis?"<<
p = new int *[N];
p[i] = new int[N];//分配数组大小
cout<<" input 1 to inittrix"<<endl<<"input 2 to output trix"<<endl<<" input 3 to output the max num'sposition"<<endl<<"input 4 to output the min num's position"<<endl<<" input 0 to exit"<< cout<<"--------------------------------"<<
for(int oflag=0; oflag<100; oflag++)
switch(flag)//将switch嵌套到for循环,实现多次操作
iniTrix(p);
_output(p);
a=trixMax(p);
cout<<"the maxnum'positinis:"<<endl<<"("<<a[1]<<","<<a[2]<<")"<<
a=trixMin(p);
cout<<"the minnum'positinis:"<<endl<<"("<<a[1]<<","<<a[2]<<")"<<
cout<<"don'tluanshuru OK??"<<
return 0; }
voidiniTrix(int **p)//初始化数组 {
srand(time(0));
int i = 0, j = 0;
for(i=0; i
for(j=0; j
p[i][j]=rand()0;
cout<<"initsuccessfully!"<<//初始化成功标志 }
int_angelAdd1(int **p)//从对角线(0,0)加到(N,N) {
int i=0, tmp=0;
for(i=0; i
tmp+=p[i][i];
int_angelAdd2(int **p)//从对角线(0,N)加到(N,0) {
int i=0, j=0, tmp=0;
for(i=0; i
for(j=N-1; j>=0; j++)
tmp += p[i][j];
int*trixMax(int **p)//求数组中最大数的下标 {
a = new int[2];
int i=0,j=0,tmp=0;
for(j=0; j
if(p[i][j]>tmp)
tmp = p[i][j];
int*trixMin(int **p)//求数组元素最小值得下表 {
a = new int[2];
int i=0,j=0,tmp=100;
for(j=0; j
if(p[i][j]<=tmp)
tmp = p[i][j];
void_output(int **p)//遍历数组并输出数组元素 {
int i=0, j=0;
cout<<"----This is the trixcreated!-----"<<
for(i=0; i
cout<<p[i][j]<<"";
} cout<<"-----------------------------------"<< } 运行结果:
总结: 这道题是一个对二位数组的定义以及操作,其中用到了C++中动态分配new的使用方法,特别值得注意的是要理解指针的指针这个概念。指针在C/C++中使用方式特别灵活,用好的话能节约大部分空间,还能提高代码运行效率。另外指针在函数的使用中,若是函数要返回一个数组,则可以通过传递数组指针的方式来返回其值。 能够更好的使用指针是是否能更加充分的掌握C++这门语言的一个评判标准,下面列举一些常用的比较难理解的指针方式: 1.int*a[10]; //指针数组 2.int (*a)[10];//数组指针 3.int(*a)(int); //函数指针 4.int(*a[10])(int); //函数指针数组 5.int*a,**a; //指针和指向指针的指针 6.charstr[]; //字符串数组 7.char*str, ** //字符指针和和指向字符串的指针
什么叫做函数指针数组: 如果一个指针指向某个函数,那么它便是函数指针。有时候我们如果需要在一个循环中,每次调用不同的函数(这些函数的返回值和参数相同,函数名不同,实现不同),那么就可以使用函数指针数组来使代码更加简练和易读。
最新教程周点击榜
微信扫一扫C语言用一维数组和二维数组打印杨辉三角_Linux编程_Linux公社-Linux系统门户网站
你好,游客
C语言用一维数组和二维数组打印杨辉三角
来源:Linux社区&
作者:挨踢攻城狮V
C语言用一维数组和二维数组打印杨辉三角,有图真相,先看Linux下的运行结果:
#include&stdio.h& /*用一维数组和二维数组打印杨辉三角*/#define N 100#define M 10
void one_dim_array(int *a,int num) //用一维数组打印{&int i,j,k;&printf("%5d\n",a[0]); //先打印出第一行数据& for(i=2;i&=i++)& {& &for(j=i-1;j&0;j--)& & a[j]=a[j]+a[j-1]; //每次从右向左计算每行的数据
& &for(k=0;k&i;k++) //打印每行的数据& & printf("%5d",a[k]);& &printf("\n");& }}
int main(){&int arr[N]={1,0}; //此处定义一个一维数组,首项为1,其他项为0&int a[M][M];&&int i,j;&printf("Input the lines: ");&scanf("%d",&n);&printf("using one_dim_array:\n");&one_dim_array(arr,n);
&printf("using double_dim_array:\n");&for(i=0;i&M;i++)& & &{& &
&a[i][0]=1;& &
& a[i][i]=1;& & &}
&for(i=2;i&M;i++)& for(j=1;j&i;j++)&
a[i][j]=a[i-1][j-1]+a[i-1][j];&for(i=0;i&M;i++)&{&
for(j=0;j&=i;j++)& printf("%5d",a[i][j]);&
printf("\n");&}&return 0;}
将C语言梳理一下,分布在以下10个章节中:
Linux-C成长之路(一):Linux下C编程概要
Linux-C成长之路(二):基本数据类型
Linux-C成长之路(三):基本IO函数操作
Linux-C成长之路(四):运算符
Linux-C成长之路(五):控制流
Linux-C成长之路(六):函数要义
Linux-C成长之路(七):数组与指针
Linux-C成长之路(八):存储类,动态内存
Linux-C成长之路(九):复合数据类型
Linux-C成长之路(十):其他高级议题
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
本文永久更新链接地址:
相关资讯 & & &
& (03/16/:52)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款博客访问: 417
博文数量: 1
博客积分: 0
博客等级: 民兵
技术积分: 0
注册时间:
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
原文地址: 作者:
先看下列代码的输出是什么?
int main()
& & int m[5] = { 0,1,2,3,4 };
& & int* p = (int*)(&m+1);
& & printf("%d,%d\n", *(m+1), *(p-1));
& & return 0;
要知道这个输出,最关键的是要理解指针操作的“加”和“减”,假设有一指针ptr,则“ptr”中的“1”是指ptr所指类型的大小。因此上述代码中的“&m+1”中的“1”实质是“sizeof(m)”,而后一个“1”则“sizeof(m[0])”。
为什么“&m+1”中的“1”是“sizeof(m)”?根本原因在于“&a”实际是一个二维数组“int (*)[5]”的首地址,而不是一维数组“int [5]”的首地址,看下面这段代码就容易理解:
int main()
& & int m[5] = { 0,1,2,3,4 };
& & int* p = (int*)(&m+1);
& & printf("%d,%d\n", *(m+1), *(p-1));
& & int (*pp)[5] = (&m+1);
& & printf("%d\n", pp[0][4]);
& & return 0;
而要注意:上面的“p”仍然是一个一维数组的首地址!下面演示把一个一维数组变成真正的二维数组使用:
int main()
& & int m[5] = { 0,1,2,3,4 };
& & int** ppm = (int**)m; // 这里也可以写成:int** ppm = (int**)&m;,&m、m和&m[0]的区别是什么?
& & int (*pm)[3] = (int (*)[3])
& & printf("%d\n", pm[1][1]);
& & return 0;
下列代码的输出又是什么了?或者代码有问题?
int main()
& & int m[5] = { 0,1,2,3,4 };
& & int** ppm = (int**)m;
& & int (*pm1)[3] = (int (*)[3])&m;
& & int (*pm2)[3] = (int (*)[3])
& & int (*pm3)[3] = (int (*)[3])&
& & printf("%d,%d,%d\n", pm1[1][1], pm2[1][1], pm3[1][1]);
& & return 0;
指针加减,要看它指向的类型,移动大小是指向类型的大小。实际上,内存中的pm[0]和pm[1]是连续在一起的,并没有分成两行,只是为了理解二维数组经常被画成二维表格形式。
关联贴:()。
阅读(67) | 评论(0) | 转发(0) |
上一篇:没有了
下一篇:没有了
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 一维数组表示二维数组 的文章

 

随机推荐