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、声明数组参量

前提:实际参数是一个数组名。C对于int a  [ ] 和 int * a作了同样解释,即a是指向int的指针

由于原型允许省略名称,因此下列4种原型都是等价的。

[cpp] view plain copy

  1. /**   函数原型声明4中等价形式
  2. int sum (int *a , int n)
  3. int sum (int * , int )
  4. int sum (int a[] , int n)
  5. int sum (int [] , int )   //可能略微不熟悉的一种
  6. */

定义函数时,名称是不可以省略的,以下两种形式是等价的。

[cpp] view plain copy

  1. /**   函数原型声明4中等价形式
  2. int sum (int *a , int n)
  3. {}
  4. int sum (int a[] , int n)
  5. {}
  6. */

4、a与&a的区别

[cpp] view plain copy

  1. int num =0 ;                       //在32机器中告诉C编译器分配4个字节的内存
  2. int a [] = {1,3,5,12,6,7,54,32};   //告诉C编译器分配32个字节的内存
  3. printf("a:%d ,a+1:%d,&a:%d,&a+1:%d\n",a,a+1,&a,&a+1) ;
  4. //a+1 和 &a+1 结果不一样
  5. //虽然输出结果上面,a和&a一样 。 但是a 和 &a所代表的数据类型不一样
  6. /*重要*/
  7. //a 代表的数据首元素的地址 (首元素),同时与整个数组地址重合,但其不能代表整个数组,只能代表起始个体的地址
  8. //&a代表的是整个数组的地址   (特别特别的注意) 它的加1是以整块数组所占字节数总数为单位1

输出结果:a:1638176 ,a+1:1638180,&a:1638176,&a+1:1638208

5、指针所占字节数

指针所占用的字节数和操作系统和编译器有关。

[cpp] view plain copy

  1. /**
  2. 2016-7-12 Jason Gel
  3. **/
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7. //void printArray(int * a ,int num ) 和  void printArray(int a[] ,int num )是等价的
  8. //函数定义时候,名称是不可以省略的。函数原型容许省略名称。
  9. /**   函数原型声明4中等价形式
  10. int sum (int *a , int n)
  11. int sum (int * , int )
  12. int sum (int a[] , int n)
  13. int sum (int [] , int )   //可能略微不熟悉的一种
  14. */
  15. void printArray(int * a ,int num )
  16. {
  17. int i ;
  18. for(i = 0; i< num; i++)
  19. {
  20. printf("%3d",a[i]);
  21. }
  22. printf("\n");
  23. }
  24. //这里用的是冒泡排序(起泡排序)
  25. void sortArray(int *a ,int num )
  26. {
  27. int i ,j ,temp;
  28. for(i =0 ;i <num;i++)              //外层:每次选定出需要排序的一个元素,依次向后
  29. {
  30. for( j=i+1; j<num; j++ )  //内层:外层选定的一个元素与其后所有元素依次比较,找出最小的元素
  31. {
  32. if(a[i]>a[j])     //交换类代码
  33. {
  34. temp = a[i];
  35. a[i]=a[j];
  36. a[j]=temp;
  37. }
  38. }
  39. }
  40. }
  41. int main ()
  42. {
  43. int num =0 ;                       //在32机器中告诉C编译器分配4个字节的内存
  44. int a [] = {1,3,5,12,6,7,54,32};   //告诉C编译器分配32个字节的内存
  45. int test =5;
  46. int *p = &test;
  47. int num1 = 0;
  48. num1 = sizeof(p)/sizeof(p[0]);
  49. printf("num1:%d, sizeof(p):%d,sizeof(p[0]):%d \n",num1,sizeof(p),sizeof(p[0]));
  50. sortArray(p,num1);
  51. printf("单一元素排序之后:");
  52. printArray(p,num1);
  53. printf("a:%d ,a+1:%d,&a:%d,&a+1:%d\n",a,a+1,&a,&a+1) ;
  54. printf("sizeof(num1):%d\n",sizeof(num1));
  55. printf("sizeof(a):%d\n\n",sizeof(a));
  56. printf("sizeof(int):%d sizeof(double):%d sizeof(char):%d \n",sizeof(int),sizeof(double),sizeof(char)) ;
  57. printf("sizeof(int *):%d sizeof(double*):%d sizeof(char*):%d \n",sizeof(int *),sizeof(double*),sizeof(char*)) ;
  58. //a+1 和 &a+1 结果不一样
  59. //虽然输出结果上面,a和&a一样 。 但是a 和 &a所代表的数据类型不一样
  60. /*重要*/
  61. //a 代表的数据首元素的地址 (首元素),同时与整个数组地址重合,但其不能代表整个数组,只能代表起始个体的地址
  62. //&a代表的是整个数组的地址   (特别特别的注意) 它的加1是以整块数组所占字节数总数为单位1
  63. //  num =sizeof(a);//这个是获取的整个数组的字节数,为32个字节
  64. printf("实参a的数据类型为整个数组,所占字节为:%d \n",sizeof(a)) ;
  65. //    num = sizeof(a)/sizeof(int);
  66. num = sizeof(a)/sizeof(a[0]); //注意规范
  67. printf("排序之前:");
  68. printArray(a,num);
  69. sortArray(a,num);
  70. printf("排序之后:");
  71. printArray(a,num);
  72. return 0;
  73. }

VC 32位编译器 运行截图:

64位编译器运行截图:

核心:

可以看出在64位机器中,int*的指针为8个字节,在32位中int*为 4个字节,由于:

[cpp] view plain copy

  1. sizeof(p)/sizeof(p[0]) //等价于sizeof(int * ) /sizeof( int )

所以在64位机器上面原本应该为1的现在变成了2,导致程序出现错误。

从程序输出结果我们可以看出:实参a的数据类型为整个数组,所占字节为32。虽然实参a表示的是数组名,但是它实际的数据类型不是int *,而是表示的整个数组所占字节数。这里不要与前文的a与&a表示地址时候弄混淆。

-----------------------------------------------

 1 #include <stdio.h>
 2 void printArray(double *p,int n);
 3 void printArray2(double a[], int n);
 4 void printArray3(double (*p)[5], int n);
 5 int main(int argc, char *argv[])
 6 {
 7     double a[] = { 1.0, 2.0, 3.0, 5.0, 6.0 };
 8     double b[][3] = { { 1, 2, 3 }, { 4, 5, 6 }, {7,8,9} };
 9     printArray(a, sizeof(a) / sizeof(double));//a 传递的是a数组首元素的首地址
10     printArray2(a, sizeof(a) / sizeof(double));
11     printArray3(&a, sizeof(a) / sizeof(double));//&a 传递的是整个数组的首地址
12     //虽然传递a和&a时传过去的值是相同的,但是意义不同,接受他的形参也要不同,
13     //数组名a传过去的就是首元素首地址,可以用一个double类型指针接受
14     printf("a的地址:%d", a);//正确
15     printf("&a的地址:%d", &a);//正确
16
17         /*char s1[] = "hello rupeng.com";
18         char *p = s1;
19         p = p + 2;//char是一个字节,向后移动2*1 个字节
20         printf("%s\n", s1);
21         printf("%s\n", p);
22
23         char *p2 = s1;
24         p2 += 5;
25         int i = p2 - p;
26         printf("%d\n", i);
27
28         int nums[] = { 11, 22, 33, 44, 55 };
29         int *iP1 = nums;
30         int *iP2 = nums;
31         iP2 = iP2 + 3;
32         printf("%d\n", *iP2);
33         printf("%d\n", iP2 - iP1);
34         //同类型指针相减,得出的是相距的数据类型的长度
35
36         //int aaa = iP2-p2;
37         */
38         getchar();
39     return 0;
40 }
41 void printArray(double *p, int n)//一维数组首元素首地址传过来后指针p和数组名可以同样使用
42 {
43     printf("printArray_a:\n");//正确
44     for (int i = 0; i < n; i++)
45     {
46         printf("%lf ", *(p + i));
47     }
48     printf("\n");
49     printf("printArray_b:\n");//正确
50     for (int i = 0; i < n; i++)
51     {
52         printf("%lf ", p[i]);
53     }
54     printf("\n");
55 }
56
57 void printArray2(double a[], int n)
58 {
59     printf("printArray2_a:\n");//正确
60     for (int i = 0; i < n; i++)
61     {
62         printf("%lf ", a[i]);
63     }
64     printf("\n");
65     printf("printArray2_b:\n");
66     for (int i = 0; i < n; i++)
67     {
68         printf("%lf ", *(a+i));// a+i不正确
69     }
70     printf("\n");
71 }
72
73 void printArray3(double(*p)[5], int n)//传过来整个数组的首地址&a,接受指针为(*p)[5],*p相当于数组名
74 {
75
76     printf("printArray3_a:\n");//正确
77     printf("(*p)[5]的地址:%d\n", (*p)[5]);//
78     printf("(*p)的地址:%d\n", (*p));
79     for (int i = 0; i < n; i++)
80     {
81         printf("%lf ", (*p)[i]);
82     }
83     printf("\n");
84     printf("printArray3_b:\n");//错误
85     for (int i = 0; i < n; i++)
86     {
87         printf("%lf ", (*p)+i);//(*p)[5]、*p[i]、*(p+i)、(*p)+i不正确
88     }
89     printf("\n");
90 }
91 //给一维数组传指针时通常使用a而不是&a,接受的指针可以为同类型的指针*p,p和a的使用方法相同,可以p[i]和*(p + i)
时间: 2024-10-11 18:10:40

c语言操作一维数组-3的相关文章

黑马程序员——C语言基础---一维数组详解

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 1.数组:相同类型的若干个数组组成一个有序的集合2.一维数组:      数组的每个元素都是基本数据类型的变量      数组的每个元素都不是一个数组3.一维数组的定义       数组类型  数组名[数组长度];        int

C语言之一维数组与指针

一维数组: 假如有一维数组如下: char a[3]; 该数组有3个元素,数据类型为char型,地址空间如下. 如果想访问数据,直接使用a[0].a[1].a[2]取出相应地址空间的值即可 一级指针: 指针即地址,char *b即定义一个指向char型数据的指针,int *b即定义一个指向int型数据的指针. int a=5; int *b=&a; 例子解析:定义一个int型数据a,值为5,定义一个指向int型的指针b,b的值为a的地址.使用*b就是b指向地址的值.地址空间如下. 二级指针: 二

【学习ios之路:C语言】一维数组,数组排序,字符数组

1.数组 数组,快速定义多个变量. 数组定义: 数据类型 数组名[数组元素的个数] = {值1, 值2, 值 3}; 数组所占存储空间大小 = 数组元素个数 * 每个元素所占的存储空间大小. %lu  unsigned long 无符号的长整型. 无符号 >=0 sizeof 存储大小值  //用来计算一个变量,类型,以及数组所占存储空间的大小. int a[5] = { 2, 7, 4, 3, 6 };  printf("%lu\n", sizeof(arr)); //5 in

C语言复习——一维数组部分程序

1.求一个数组中最值和最值所在数组中的下标. 程序如下: #include<stdio.h> #pragma warning(disable:4996);//在VS中编译时由于使用了scanf函数警告不安全,无法通过,此语句是为了消除这个警告 int main() { int a[5]; int max,min; int index1,index2; printf("请输入数组元素值:"); for (int j= 0; j<5; j++) { scanf("

C语言用一维数组打印杨辉三角(原:无意中想到)

//求前10行的数 1 int a[11] = { 1 }; 2 a[0] = 1, a[1] = 1; 3 int i, j,m; 4 for (i = 2; i <= 11; i++) //2-11 输出10行 5 { 6 for (j = i - 1; j > 1; j--) //关键在这句,倒着求 7 { 8 a[j] = a[j] + a[j - 1]; 9 printf("%5d", a[j]); 10 } 11 printf("%5d\n"

C语言一维数组初步学习笔记

数组 可以存储一组或者多组数值的变量,里面包含多个元素,数组的每个成员都是一个数组元素. 一维数组 定义:类型 数组名[常量表达式] = {值1, 值2, 值3…}; ? 1 2 3 4 int a[3] = {0, 1, 2}; float f[2] = {1.2, 2.3, 3.14}; char str[] = {'h', 'e', 'l', 'l', 'o'}; chat str1 = "iPhone";//这也是定义字符数组的方法,字符数组后面会详细讲解,这里先了解一下 当数

C语言--一维数组,字符数组

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { #pragma mark----------数组 //数组是容器,相同数据类型 //构造类型 // int a[3]={5,2,0}; //类型 // int[3]; //变量名 // a; //初值 // {5,2,0}; // int a[4] = {9,8,7,6}; // float b[6] = {2.5,3.14}; // char

C语言一维数组、二维数组、结构体的初始化

C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始化后,a[0]=0,a[1]=1,… ,a[9]=9. (2)初始化时可以只对一部分元素赋初值.例如: static int a[10]={0,1,2,3,4}; 定义的数组有10个元素,但只对其中前5个元素赋了初值,后5个元素初值为0. (3)将数组的元素值全部为0,可以用下面的方法:(方法一)

【C语言】-指向一维数组元素的指针

本文目录 一.用指针指向一维数组的元素 二.用指针遍历数组元素 三.指针与数组的总结 四.数组.指针与函数参数 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 前面我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向这个变量.数组及其数组元素都占有存储空间,都有自己的地址,因此指针变量可以指向整个数组,也可以指向数组元素. 回到顶部 一.用指针指向一维数组的