标签:应该 个数 核心 har jsb 技术 print 使用方法 交换
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位机器出现错误结果,原因见本文最后。
VC 32位编译器 运行截图:
64位编译器运行截图:
核心:
可以看出在64位机器中,int*的指针为8个字节,在32位中int*为 4个字节,由于:
所以在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)
标签:应该 个数 核心 har jsb 技术 print 使用方法 交换
原文地址:http://www.cnblogs.com/zhubinglong/p/5984209.html