二维数组和指针数组做形参

先回顾一下二维数组的写法:

1. int array[3][4];

2. int array[][4];

3. int (*array)[4];

不管怎么样,二维的长度是不能省略的,多维数组(不管二维,三维,四维。。。)最多只能省略第一维的长度;

比较好玩的是第三种:

注意两种不同: int (*array1)[N];

int  *array2[N];

我比较喜欢下面这种方式,那么两种有什么不同呢,int (*array1)[N] ------array1是一个指向一维数组的指针,

而  int *array2[N]  -------array2是一个指针数组(一个数组,里面存放的每一个都是指针)

如果你看一下它们的类型就会发现, array1 的类型是指向 int[N]的指针,这种写法和int[][N]是一样一样的,可以类比  int *arr  int arr[]来记

而array2 的类型是int *   所以这种写法和int **是一样一样的

考虑好下个问题,就很清楚了,我们现在要对字符串排序,那么实现的方法无非是两种,一种是二维数组实现,一种是用指针数组实现

我们以 int (*array)[N]为例:

1 void sort1(char (*str)[100], const int len){
 2     if(len>1){
 3         char temp[1024];
 4         int left=0,right=len-1;
 5         while(left<right){
 6            strcpy(temp,str[left]);
 7             while(left<right&&strcmp(str[right],temp)>=0){
 8                 right--;
 9             }
10             strcpy(str[right],str[left]);
11             while(left<right&&strcmp(str[left],temp)<0){
12                 left++;
13             }
14             strcpy(str[left],str[right]);
15         }
16         strcpy(str[right],temp);
17         sort1(str,left);
18         sort1(str+right+1,len-right-1);
19     }

20 }

1 char s[][100]={"c++","prime","linux","programming","design","advanced"\
2         ,"programming2","of","unix"};

3 sort1(s,9);

注意形参和实参

再来看第二种

1 void sort(char *str[],const int len)
 2 {
 3     if(len>1){
 4         int left=0,right=len-1;
 5         while(left<right){
 6             char temp[100];
 7             strcpy(temp,str[left]);
 8             while(left<right&&strcmp(str[right],temp)>=0){
 9                 right--;
10             }
11             swap(str,left,right);
12             while(left<right&&strcmp(str[left],temp)<0){
13                 left++;
14             }
15             swap(str,left,right);
16         }
17         sort(str,left);
18         sort(str+right+1,len-right-1);
19     }

20 }

1 char *s[100]={"c++","prime","linux","programming","design","advanced"\
2         ,"programming2","of","unix"};

3 sort(s,9);

char *s[N]使用十分方便

时间: 2024-08-11 07:25:03

二维数组和指针数组做形参的相关文章

C++ 在堆上开辟与释放二维、三维指针

//C++ 在堆上开辟与释放二维.三维指针 #include<iostream> using namespace std; int main() { //二级指针的开辟与释放 int number = 0; int** p = new int*[4]; for(int i = 0; i < 4; i++) //分级定义数组大小 { p[i] = new int[4]; } for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j

数组、指针数组、数组指针、返回数组指针的函数的关系

直接上代码吧,解释说得很清楚了. // C++Primer.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> using namespace std; int (*function(int i))[10];//返回数组指针的函数 int main() { cout<<"数组.指针数组.数组指针.返回数组指针的函数:"<<endl<<endl; in

C++二维数组(指针)做参数

一.问题描述 使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃.下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍. 1.二维数组的定义与初始化 在实际使用数组的时候往往开始不知道二维数组的行数和列数,因此程序需要根据用户输入动态定义二维数组的行和列.这里通过C++二级指针来实现,引入变量 int rowNum 行 数, int coluNum 列数, char **p 二维字符数组,这里假定二维字符数组中的字符只能为'0'和'1'. int

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

c++ 用new创建二维数组~创建指针数组【转】

#include <iostream> using namespace std; void main() { //用new创建一个二维数组,有两种方法,是等价的 //一: int (*p)[10] = new int[5][10]; //二: int **p = new int* [5]; for(int i=0;i <5;i++) p[i] = new int[10]; //指针数组的创建,也有两种方法 //一: char **pa = new char* [4]; for (int

c语言中数组,指针数组,数组指针,二维数组指针

1.数组和指针 int array[5] = {1,2,3,4,5};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0] == *(array+0) printf("%p\n", pa); printf("%p\n", array); /* 访问数组两种方式 1. 下标法访问 数组名[下标] 指针[下标] 下标:偏移量 2. 指针法访问 *(p+1) *

hdu1081 DP类最长子段和(二维压缩+前缀和数组/树状数组计数)

题意:给出一个 n * n 的数字矩阵,问最大子矩阵和是多少. 由于和最长子段和问题类似,一开始想到的就是 DP ,一开始我准备用两个循环进行 DP ,对于每一个 (i,j) ,考察(i - 1,j)与(i,j - 1), dp 值代表以该点为右下角的最大矩阵和,同时记录下这个矩阵的左上角坐标,状态转移时通过将原和最大矩阵通过补边推到当前和最大矩阵.但是其实这种做法有一个明显的问题,就是转移时,补上边后 dp 值相同怎么办,dp 值相同而矩阵不同的话会影响到下一次状态转移后补上的矩阵的情况,从而

二维最大和子数组

1.设计思路 因为计算了一位的最大和子数组,所以想办法将二维的数组转换成一维子数组进行求解: 首先,将二维数组的第一行(列)赋值到新的一维数组中,在一维的数组中求得子数组的最大值, 然后,将二维数组的第二行(列)加到一维数组中,再次求得子数组的最大值,并和第一步求得的最大值进行比较,若新的值比较大,留下最大值,如果新值比较小,退出这一个循环,从第二行(列)开始第一步,这样就可以求出最大和子数组: 2.源代码 #include<iostream> #include<ctime> us

$[SHOI2007]$ 园丁的烦恼 二维数点/树状数组

\(Sol\) 设一个矩阵的左上角为\((x_1,y_1)\),右下角为\((x_2,y_2)\),\(s_{x,y}\)是到\((1,1)\)二维前缀和,那么这个矩阵的答案显然是\(s_{x_2,y_2}-s_{x_1-1,y_2}-s_{x_2,y_1-1}+s_{x_1-1,x_2-1}\).考虑把每个询问拆成这么四个二维前缀和的询问.将所有询问的\(s_{x,y}\)按照\(x\)排序,依次计算,这样我们就可以忽略\(x\)的限制而只考虑\(y\)的限制了.每次扫到一个询问,先把\(x\