c语言操作一维数组-3
C语言选择题
#include
main()
{double a[15],k;
k=fun(a);
}
则以下选项中错误的fun函数首部是 ( D)
A.double fun(double a[15]) B.double fun(double *a)
C.double fun(double a[]) D.double fun(double a)
------------------------------------------------
http://blog.csdn.net/jin13277480598/article/details/51891816
:a[n]时等价于*(a+n),即寻址到内存的a,然后移动n个单元,再取出数组。故p[0]等价于*(p+0),该值的类型为int型。
num1=sizeof(p)/sizeof(p[0]) 等价于 num1=sizeof(p)/sizeof(int );
该语句在语法上面没有任何错误,但是在32机器和64位机器运行结果不同,在32机器出现正常结果,64位机器出现错误结果,原因见本文最后。
3、声明数组参量
- /** 函数原型声明4中等价形式
- int sum (int *a , int n)
- int sum (int * , int )
- int sum (int a[] , int n)
- int sum (int [] , int ) //可能略微不熟悉的一种
- */
定义函数时,名称是不可以省略的,以下两种形式是等价的。
- /** 函数原型声明4中等价形式
- int sum (int *a , int n)
- {}
- int sum (int a[] , int n)
- {}
- */
4、a与&a的区别
- int num =0 ; //在32机器中告诉C编译器分配4个字节的内存
- int a [] = {1,3,5,12,6,7,54,32}; //告诉C编译器分配32个字节的内存
- printf("a:%d ,a+1:%d,&a:%d,&a+1:%d\n",a,a+1,&a,&a+1) ;
- //a+1 和 &a+1 结果不一样
- //虽然输出结果上面,a和&a一样 。 但是a 和 &a所代表的数据类型不一样
- /*重要*/
- //a 代表的数据首元素的地址 (首元素),同时与整个数组地址重合,但其不能代表整个数组,只能代表起始个体的地址
- //&a代表的是整个数组的地址 (特别特别的注意) 它的加1是以整块数组所占字节数总数为单位1
5、指针所占字节数
- /**
- 2016-7-12 Jason Gel
- **/
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- //void printArray(int * a ,int num ) 和 void printArray(int a[] ,int num )是等价的
- //函数定义时候,名称是不可以省略的。函数原型容许省略名称。
- /** 函数原型声明4中等价形式
- int sum (int *a , int n)
- int sum (int * , int )
- int sum (int a[] , int n)
- int sum (int [] , int ) //可能略微不熟悉的一种
- */
- void printArray(int * a ,int num )
- {
- int i ;
- for(i = 0; i< num; i++)
- {
- printf("%3d",a[i]);
- }
- printf("\n");
- }
- //这里用的是冒泡排序(起泡排序)
- void sortArray(int *a ,int num )
- {
- int i ,j ,temp;
- for(i =0 ;i <num;i++) //外层:每次选定出需要排序的一个元素,依次向后
- {
- for( j=i+1; j<num; j++ ) //内层:外层选定的一个元素与其后所有元素依次比较,找出最小的元素
- {
- if(a[i]>a[j]) //交换类代码
- {
- temp = a[i];
- a[i]=a[j];
- a[j]=temp;
- }
- }
- }
- }
- int main ()
- {
- int num =0 ; //在32机器中告诉C编译器分配4个字节的内存
- int a [] = {1,3,5,12,6,7,54,32}; //告诉C编译器分配32个字节的内存
- int test =5;
- int *p = &test;
- int num1 = 0;
- num1 = sizeof(p)/sizeof(p[0]);
- printf("num1:%d, sizeof(p):%d,sizeof(p[0]):%d \n",num1,sizeof(p),sizeof(p[0]));
- sortArray(p,num1);
- printf("单一元素排序之后:");
- printArray(p,num1);
- printf("a:%d ,a+1:%d,&a:%d,&a+1:%d\n",a,a+1,&a,&a+1) ;
- printf("sizeof(num1):%d\n",sizeof(num1));
- printf("sizeof(a):%d\n\n",sizeof(a));
- printf("sizeof(int):%d sizeof(double):%d sizeof(char):%d \n",sizeof(int),sizeof(double),sizeof(char)) ;
- printf("sizeof(int *):%d sizeof(double*):%d sizeof(char*):%d \n",sizeof(int *),sizeof(double*),sizeof(char*)) ;
- //a+1 和 &a+1 结果不一样
- //虽然输出结果上面,a和&a一样 。 但是a 和 &a所代表的数据类型不一样
- /*重要*/
- //a 代表的数据首元素的地址 (首元素),同时与整个数组地址重合,但其不能代表整个数组,只能代表起始个体的地址
- //&a代表的是整个数组的地址 (特别特别的注意) 它的加1是以整块数组所占字节数总数为单位1
- // num =sizeof(a);//这个是获取的整个数组的字节数,为32个字节
- printf("实参a的数据类型为整个数组,所占字节为:%d \n",sizeof(a)) ;
- // num = sizeof(a)/sizeof(int);
- num = sizeof(a)/sizeof(a[0]); //注意规范
- printf("排序之前:");
- printArray(a,num);
- sortArray(a,num);
- printf("排序之后:");
- printArray(a,num);
- return 0;
- }
VC 32位编译器 运行截图:
64位编译器运行截图:
核心:
可以看出在64位机器中,int*的指针为8个字节,在32位中int*为 4个字节,由于:
- sizeof(p)/sizeof(p[0]) //等价于sizeof(int * ) /sizeof( int )
所以在64位机器上面原本应该为1的现在变成了2,导致程序出现错误。
从程序输出结果我们可以看出:实参a的数据类型为整个数组,所占字节为32。虽然实参a表示的是数组名,但是它实际的数据类型不是int *,而是表示的整个数组所占字节数。这里不要与前文的a与&a表示地址时候弄混淆。
-----------------------------------------------
#include <stdio.h>
void printArray(double *p,int n);
void printArray2(double a[], int n);
void printArray3(double (*p)[], int n);
int main(int argc, char *argv[])
{
double a[] = { 1.0, 2.0, 3.0, 5.0, 6.0 };
double b[][] = { { , , }, { , , }, {,,} };
printArray(a, sizeof(a) / sizeof(double));//a 传递的是a数组首元素的首地址
printArray2(a, sizeof(a) / sizeof(double));
printArray3(&a, sizeof(a) / sizeof(double));//&a 传递的是整个数组的首地址
//虽然传递a和&a时传过去的值是相同的,但是意义不同,接受他的形参也要不同,
//数组名a传过去的就是首元素首地址,可以用一个double类型指针接受
printf("a的地址:%d", a);//正确
printf("&a的地址:%d", &a);//正确 /*char s1[] = "hello rupeng.com";
char *p = s1;
p = p + 2;//char是一个字节,向后移动2*1 个字节
printf("%s\n", s1);
printf("%s\n", p); char *p2 = s1;
p2 += 5;
int i = p2 - p;
printf("%d\n", i); int nums[] = { 11, 22, 33, 44, 55 };
int *iP1 = nums;
int *iP2 = nums;
iP2 = iP2 + 3;
printf("%d\n", *iP2);
printf("%d\n", iP2 - iP1);
//同类型指针相减,得出的是相距的数据类型的长度 //int aaa = iP2-p2;
*/
getchar();
return ;
}
void printArray(double *p, int n)//一维数组首元素首地址传过来后指针p和数组名可以同样使用
{
printf("printArray_a:\n");//正确
for (int i = ; i < n; i++)
{
printf("%lf ", *(p + i));
}
printf("\n");
printf("printArray_b:\n");//正确
for (int i = ; i < n; i++)
{
printf("%lf ", p[i]);
}
printf("\n");
} void printArray2(double a[], int n)
{
printf("printArray2_a:\n");//正确
for (int i = ; i < n; i++)
{
printf("%lf ", a[i]);
}
printf("\n");
printf("printArray2_b:\n");
for (int i = ; i < n; i++)
{
printf("%lf ", *(a+i));// a+i不正确
}
printf("\n");
} void printArray3(double(*p)[], int n)//传过来整个数组的首地址&a,接受指针为(*p)[5],*p相当于数组名
{ printf("printArray3_a:\n");//正确
printf("(*p)[5]的地址:%d\n", (*p)[]);//
printf("(*p)的地址:%d\n", (*p));
for (int i = ; i < n; i++)
{
printf("%lf ", (*p)[i]);
}
printf("\n");
printf("printArray3_b:\n");//错误
for (int i = ; i < n; i++)
{
printf("%lf ", (*p)+i);//(*p)[5]、*p[i]、*(p+i)、(*p)+i不正确
}
printf("\n");
}
//给一维数组传指针时通常使用a而不是&a,接受的指针可以为同类型的指针*p,p和a的使用方法相同,可以p[i]和*(p + i)
c语言操作一维数组-3的更多相关文章
- 【C语言】-一维数组
数组: 数组是一系列相同类型的有序数据的集合,数组中的每一个元素都是同一个数据类型,所有元素共用一个名字,用下标来区别数组中的每一个元素. C语言中,数组属于构造数据类型.一个数组中含有多个数组元素, ...
- C语言中一维数组
(1)输出数组元素 #include<stdio.h> int main() { int index; /*定义循环变量*/ int iArray[6]={0,1,2,3,4,5}; /* ...
- C语言之一维数组与指针
一维数组: 假如有一维数组如下: ]; 该数组有3个元素,数据类型为char型,地址空间如下. 如果想访问数据,直接使用a[0].a[1].a[2]取出相应地址空间的值即可 一级指针: 指针即地址,c ...
- C语言《一维数组的学习,冒泡排序》
#include<stdio.h> /* 一维数组的学习,冒泡排序 soulsjie 20170623 */ void main(){ int a[6]; int i,j,k; print ...
- 11-C语言指针&一维数组&字符串
一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...
- C语言用一维数组打印杨辉三角(原:无意中想到)
本贴地址 ] = { }; a[] = , a[] = ; int i, j,m; ; i <= ; i++) //2-11 输出10行 { ; j > ; j--) //关键在这句,倒着 ...
- (十四)C语言之一维数组、二维数组
- C语言一维数组中的数据随机排列
#include <stdio.h>#include <stdlib.h> void randomlize(int *a, int n){ int i = 0,j ...
- MSIL实用指南-一维数组的操作
本篇讲解怎么生成和操作一维数组.各种数组类型创建的步骤是一样的,但是加载和保存步骤有所不同. 一.创建数组所有类型的一维数组创建都是一样的,分三步.1.加载数组长度2.生成指令 Newarr < ...
随机推荐
- java文章显示内容部分(将html转成纯文本)
public static String splitAndFilterString(String input, int length) { if (input == null || input.tri ...
- python成长之路【第九篇】:网络编程
一.套接字 1.1.套接字套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Commun ...
- TC250专场
SRM 623 DIV2 1000pt 题意:给出一个最多50*50的矩阵,每个单元可能为'.'.'P'.'A','.'代表空地,你每次操作可以把一个P或者A拿到空地上,求一个最大的含有相同字符的矩形 ...
- 离线更新VSAN HCL数据库
从VSAN 6.0起,VSAN提供了Health Check功能,其中就包括VSAN HCL数据库,通过此运行状况检查验证用于 HCL 检查的 VMware 兼容性指南数据库是否是最新的.这些 VCG ...
- 设置DataSource后DateGridView不显示的问题
在一个WinForm小程序中,有两处需要用DataGridView控件显示数据.设置DataGridView.DataSource为数据查询结果后,第一个DataGridView可以正常显示数据,而第 ...
- 无线OSS-高精度整数加法
#include<iostream> #include<string> using namespace std; int compareStr(string str1, str ...
- 项目部署到tomcat Root中后导致 WebApplicationContext 初始化两次的解决方法
上一篇文章刚说项目部署到tomcat的ROOT中,今天就发现一个问题.通过eclipse启动tomcat时候,WebApplicationContext 初始化两次: 现象: 通过eclipse控 ...
- 20169212《Linux内核原理与分析》第五周作业
关于linux内核源码 两个很关键的目录,一个是arch(architecture),支持不同cpu体系架构的源代码,其中最重要的就是x86(一般把x86留下,其他的目录删掉),另一个是init(其中 ...
- 更新Debian软件源
更新Debian软件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list_bak #备份一下软件源 sudo vi /etc/apt/source ...
- Web自动化基础(一)使用Selenium定位元素
什么是元素?我们知道网页上有什么内容显示出来,比如一个按钮,一个输入框,一张图片,都可以理解成元素,这些元素是由html代码构成的,比如图片可以用<img>标签来展示,一个输入框可以用&l ...