标签:
1.int a; int*a; int **a; int (*a)[10]; int (*a) (int)的区别。
a) int a 表示一个内存空间,这个空间用来存放一个整数。
b) int *a指向一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间。
c) int **a表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。指向了一个b)中提到的空间。
d) int(*a)[10]表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为10,类型为int的数组;与int **a的差别主要体现在a++上。
e) int (*a) (int)表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个int型的参数,并且函数的放回类型也是int。
2.当声明一个数组时,数组的名字也是一个指针。32位系统上,对任意指针求sizeof,得到的结果都是4. 当数组作为函数参数进行传递时,数组自动退化为同类型的指针。
3.数组的参数传递(参考http://blog.csdn.net/dijkstar/article/details/7628638)
#include <stdio.h> // // 第一种传递方式(指针方式):int (*x)[20] // 内部可以把x当成一个二维数组使用 // void Fn1(int (*x)[20]) { for (int i=0; i<10; i++) { for (int j=0; j<20; j++) { printf("%d ", x[i][j]); } printf("\n"); } } // // 第二种传递方式(数组方式):int x[][20] // 注意:形式参数的第一维允许为空 // void Fn2(int x[][20]) { for (int i=0; i<10; i++) { for (int j=0; j<20; j++) { printf("%d ", x[i][j]); } printf("\n"); } } // // 第三种传递方式(单指针方式):int x[10][20] // 内部x为当成一个一维数组使用,需要自己转换下标位置 // void Fn3(int **x) { for (int i=0; i<10; i++) { for (int j=0; j<20; j++) { printf("%d ", x[i*20+j]); } printf("\n"); } } void main() { //定义实参(实参就是实际的准备向函数中传递的实际变量) int xx[10][20]; //给实参附上初值 for (int i=0; i<10; i++) { for (int j=0; j<20; j++) { xx[i][j] = i+j; } } //调用1——直观简单 Fn1(xx); printf("\n"); //调用2——直观简单 Fn2(xx); printf("\n"); //调用3——需要强制类型转换 Fn3((int **)xx); }
4.二维数组的初始化
#include <stdio.h> void main() { // // 字符串1数组初始化 // 欲取得xx1个数(即下面的每周7天),使用:sizeof(xx1)/sizeof(xx1[0] // char xx1[][10]= { "MON", //!!注意不要忘记【逗号】,否则认为"MONTUE"为一个字符串,编译通过,无任何警告 "TUE", "WED", "THU", "FRI", "SAT", "SUN", //<---最后一个【逗号】,可有可无 }; //printf("%d\n", sizeof(xx1)/sizeof(xx1[0])); // // 字符串2指针数组初始化特殊——可以使用下面的方式 // 注意:维数可以为空 // char *xx2[]= { "MON", //!!注意不要忘记【逗号】,否则认为"MONTUE"为一个字符串,编译通过,无任何警告 "TUE", "WED", "THU", "FRI", "SAT", "SUN", //<---最后一个【逗号】,可有可无 }; // // 其他类型(这里用整型)的二维数组初始化 // int xx3[][3]= { {11, 22, 33}, {10, 20, 30}, {12, 22, 32}, {15, 25, 35}, }; printf("%d\n", sizeof(xx3)/sizeof(xx3[0])); // // 但其他类型(这里用整型)的指针数组初始化错误!! // /* int *xx4[]= { {11, 22, 33}, {10, 20, 30}, {12, 22, 32}, {15, 25, 35}, }; */ // // 但可以先“分开”定义,再使用分开定义的变量 // int x1[] = {11, 22, 33}; int x2[] = {15, 22, 33}; int x3[] = {14, 22, 33}; int *xx4[]= { x1, x2, x3, }; }
5.例题:二维数组中的查找。
二维数组的每一行是按从左到右递增以及从上到下递增来排序的,判断数组中是否含有一个整数。
解决思想:找到最右边的列的第一个数,如果比要寻找的数大,则该列都不用再考虑,如果比要寻找的数小,则该行都不用再考虑。递归求解。
#include<iostream> using namespace std; int findnumber(int** const array,int number,int &nrows,int &ncols,const int rows,const int cols) { if(nrows==0||ncols==0) return 0; else if(array[rows-nrows][ncols-1]==number) return 1; else if(array[rows-nrows][ncols-1]>number) { ncols-=1; findnumber(array,number,nrows,ncols,rows,cols); } else if(array[rows-nrows][ncols-1]<number) { nrows-=1; findnumber(array,number,nrows,ncols,rows,cols); } } int main() //main()函数只能返回int,不能返回bool { int array[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; //error: cannot convert ‘int (*)[4]‘ to ‘int**‘ for argument ‘1‘ to ‘int findnumber(int**, int, int&, int&, int, int)‘ int rows=4; int cols=4; int nrows=rows; int ncols=cols; int number=7; return findnumber(array,number,nrows,ncols,rows,cols); }
标签:
原文地址:http://www.cnblogs.com/wy1290939507/p/4561294.html