关于二维数组和指向指针的指针

合集下载

C语言题带答案 安阳工学院2

C语言题带答案  安阳工学院2

1.选择题数据类型和表达式81.以下选项中不属于C语言的类型的是_____。

DA. signed short intB. unsigned long intC. unsigned intD. long short2.C语言提供的合法的数据类型关键字是: _____。

BA. doubleB. shortC. integerD. char3.两路选择用_____语句实现。

DA. caseB. else ifC. switchD. if…else4.下列标识中合法的用户标识符为____。

AA. yearB. longC. 7 x yzD. struct5.若有说明语句:char c='\72';则变量c____。

AA. 包含1个字符B. 包含2个字符C. 包含3个字符D. 说明不合法,c的值不确定6.下面哪个不是C中的字符常量:____。

CA.‟C‟B. ‟b‟C. “C”D.‟‟7.int i;float f;double d;表达式15 + d*f + ‟A‟ - i的值是______类型。

DA floatB intC charD double8.哪个不是C中的有效标示符:____。

AA num-2B num_2C _num_2D _num_29.下列语句正确的是:______。

DA 具有静态存储期限的变量具有文件作用域B 在函数内部声明的变量具有外部链接C 具有内部链接的变量都具有静态存储期限D 每个形式参数都具有块作用域10.x是const类型的变量,下列关于x的陈述错误的是:______。

AA 若x是int类型,可以作为switch语句中分支标号的值B 编译器将检查是否对x进行初始化C x遵循和变量一样的作用域规则D x可以是任意类型判断和循环811.设有程序段int k=10;while(k=0)k=k-1;则下面描述中正确的是________。

CA. while循环执行10次B. 循环是无限循环C. 循环体语句一次也不执行D. 循环体语句执行一次12.执行语句for(i=1;i++ < 4;); 后变量i 的值是。

二维数组引用的四种形式

二维数组引用的四种形式

二维数组引用的四种形式一、直接引用二维数组二维数组是一种特殊的数据结构,它由多个一维数组组成,并且每个一维数组的元素个数相同。

在程序中,我们可以通过直接引用二维数组来访问和操作数组中的元素。

对于一个二维数组arr,我们可以使用arr[i][j]的形式来访问数组中的元素,其中i表示行索引,j表示列索引。

例如,arr[0][0]表示二维数组arr的第一行第一列的元素。

二、指针引用二维数组除了直接引用二维数组,我们还可以使用指针来引用二维数组。

指针引用二维数组的形式为:int (*p)[n],其中p是指向一维数组的指针,n表示一维数组的长度。

通过指针引用二维数组,我们可以遍历数组中的每个元素,并对其进行操作。

例如,可以使用指针p来访问二维数组中的元素,p[i][j]表示二维数组中的第i行第j列的元素。

三、数组指针引用二维数组除了使用指针引用二维数组,我们还可以使用数组指针来引用二维数组。

数组指针引用二维数组的形式为:int (*p)[n],其中p是一个指针,指向一个长度为n的一维数组。

通过数组指针引用二维数组,我们可以通过对指针p进行加减操作,来访问数组中的每个元素。

例如,可以使用数组指针p来访问二维数组中的元素,p[i][j]表示二维数组中的第i行第j列的元素。

四、指向指针的指针引用二维数组指向指针的指针是一种特殊的指针,它指向的是一个指针变量的地址。

指向指针的指针引用二维数组的形式为:int **p,其中p是一个指向指针的指针。

通过指向指针的指针引用二维数组,我们可以通过对指针p进行加减操作,来访问数组中的每个元素。

例如,可以使用指向指针的指针p来访问二维数组中的元素,p[i][j]表示二维数组中的第i行第j 列的元素。

总结:本文介绍了四种引用二维数组的方式,包括直接引用二维数组、指针引用二维数组、数组指针引用二维数组和指向指针的指针引用二维数组。

通过这些方式,我们可以方便地对二维数组进行操作和访问。

C语言数组参数与指针参数

C语言数组参数与指针参数

C语言数组参数与指针参数我们都知道参数分为形参和实参。

形参是指声明或定义函数时的参数,而实参是在调用函数时主调函数传递过来的实际值。

一、一维数组参数1、能否向函数传递一个数组?看例子:void fun(char a[10]){char c = a[3];}intmain(){char b[10] = “abcdefg”;fun(b[10]);return 0;}先看上面的调用,fun(b[10]);将b[10]这个数组传递到fun 函数。

但这样正确吗?b[10]是代表一个数组吗?显然不是,我们知道b[0]代表是数组的一个元素,那b[10]又何尝不是呢?只不过这里数组越界了,这个b[10]并不存在。

但在编译阶段,编译器并不会真正计算b[10]的地址并取值,所以在编译的时候编译器并不认为这样有错误。

虽然没有错误,但是编译器仍然给出了两个警告:warning C4047: 'function' : 'char *' differs in levels of indirection from 'char 'warning C4024: 'fun' : different types for formal and actual parameter 1这是什么意思呢?这两个警告告诉我们,函数参数需要的是一个char*类型的参数,而实际参数为char 类型,不匹配。

虽然编译器没有给出错误,但是这样运行肯定会有问题。

如图:这是一个内存异常,我们分析分析其原因。

其实这里至少有两个严重的错误。

第一:b[10]并不存在,在编译的时候由于没有去实际地址取值,所以没有出错,但是在运行时,将计算b[10]的实际地址,并且取值。

这时候发生越界错误。

第二:编译器的警告已经告诉我们编译器需要的是一个char*类型的参数,而传递过去的是一个char 类型的参数,这时候fun 函数会将传入的char 类型的数据当地址处理,同样会发生错误。

数组与指针

数组与指针

此外,还可通过算术元运算对指针进行移动, 此外,还可通过算术元运算对指针进行移动,来达到引用 其他数组元素的目的。 其他数组元素的目的。 a[0] p p &a[0] *p a[0] a[1] p+1 p+1 &a[1] *(p+1) a[1] a[2] P+2 p+2 &a[2] *(p+2) a[2] a[3] P+3 p+3 &a[3] *(p+3) a[3] a[4] p+4 p+4 &a[4] *(p+4) a[4]
a[0] a[1] a[2] a[3] a[4]
a
a a+1 a+2 a+3 a+4
a a+1 a+2 a+3 a+4
&a[0] &a[1] &a[2] &a[3] &a[4]
*a *(a+1) *(a+2) *(a+3) *(a+4)
a[0] a[1] a[2] a[3] a[4]
例3: main() { int a[5],*p,i; for(i=0;i<5;i++) scanf(“%d”,a+i); for(i=0;i<5;i++) printf(“%d”,*(a+i)); }
a[1] a[1][0] a[1][1] a[1][2]
此处, 的值与 的值与a[0]的值相同,但是基类型不同。a是二级 的值相同, 此处,a的值与 的值相同 但是基类型不同。 是二级 指针, 是一级指针。 指针,a[0]是一级指针。 是一级指针 a &a[0][0] a[0] 因此,以下赋值语句是错误的: 因此,以下赋值语句是错误的:p=a; a &a[0] a+1 &a[1] a+i &a[i] *(a+i) a[i]

二维数组和二级指针的传递问题(转载)

二维数组和二级指针的传递问题(转载)

⼆维数组和⼆级指针的传递问题(转载)先看个⾃⼰的例⼦吧:Write an algorithm such that if an element in an M*N matrix is 0, its entire row and column are set to 0;//本作⽬的在于熟悉多维数组的传递# include<iostream># define ROW_N 3# define LINE_M 4using namespace std;//传递矩阵时候要说明维度……void print_matrix(int matrix_ptr[ROW_N][LINE_M]){for(int i=0;i<ROW_N;i++){for(int j=0;j<LINE_M;j++){//cout<<*(*(matrix_ptr+i)+j)<<' ';//*(*(matrix_ptr+i)+j) 和 matrix_ptr[i][j]等价cout<<matrix_ptr[i][j]<<'';}cout<<'\n';}}void clear_row(int matrix_ptr[ROW_N][LINE_M], int row){for (int i=0;i<LINE_M;i++){*(*(matrix_ptr + row)+i)=0;}}void clear_line(int matrix_ptr[ROW_N][LINE_M], int line){for (int i=0;i<ROW_N;i++){*(*(matrix_ptr+i)+line)=0;}}void checkzeropoint(int matrix_ptr[ROW_N][LINE_M]){int localmatrix[ROW_N][LINE_M];int i, j;for(i=0;i<ROW_N;i++){for(j=0;j<LINE_M;j++){localmatrix[i][j]=*(*(matrix_ptr+i)+j);}}print_matrix(localmatrix);for(i=0;i<ROW_N;i++){for(j=0;j<LINE_M;j++){if(*(*(localmatrix+i)+j)==0){cout<<"(i,j)="<<i<<','<<j<<endl;clear_row(matrix_ptr,i);clear_line(matrix_ptr,j);}}}}int main(){int matrix[3][4]={{1,2,3,4},{1,2,0,14},{9,8,6,5}};checkzeropoint(matrix);//cout <<matrix[0][0]<<endl;cout<<endl;print_matrix(matrix);return0;}原⽂链接:/?p=1822再次看这篇⽂章,感觉说的好多都是废话,在⽂章最前⾯补充⼀句话:“[]的优先级⾼于*”,⼤家可以带着这句话看下⾯的~~~========================再⼀次的见证了⾃⼰的基础不牢靠。

c语言二维数组的指针

c语言二维数组的指针

c语言二维数组的指针C语言是一门广泛应用于各种领域的编程语言,而二维数组和指针则是其中非常重要的两个概念。

在C语言中,我们可以通过指针来操作数组,其中涉及到二维数组的指针。

本文将围绕这个话题展开详细阐述。

1. 定义二维数组首先,我们需要定义一个二维数组。

在C语言中,二维数组的定义形如:`type array_name[row_size][col_size]`,其中 `type` 表示数组元素的类型,`array_name` 表示数组名,`row_size` 表示数组的行数,`col_size` 表示数组的列数。

以下是一个二维数组的定义示例:```Cint array[3][4];```上述代码定义了一个行数为3,列数为4的二维数组。

2. 声明二维数组指针接下来,我们需要声明一个二维数组指针。

在C语言中,二维数组指针的声明形如:`type (*pointer_name)[col_size]`,其中`type` 表示数组元素的类型,`pointer_name` 表示指针名,`col_size` 表示数组的列数。

以下是一个二维数组指针的声明示例:```Cint (*ptr)[4];```上述代码声明了一个指向行数未知,列数为4的二维数组的指针。

3. 将指针指向二维数组的某个位置接下来,我们需要将指针指向二维数组中的某个位置。

在C语言中,可以通过数组名来获取数组的首地址,从而得到指向第一个元素的指针。

例如,下面的代码将数组 `array` 的首地址赋值给指针`ptr`:```Cptr = array;```这样,指针 `ptr` 就指向了二维数组 `array` 的第一行。

4. 通过指针访问二维数组元素最后,我们可以通过指针来访问二维数组中的元素。

在C语言中,可以通过指针加上偏移量来访问数组中的元素。

例如,下面的代码访问了数组 `array` 的第一行第二列的元素:```C*(*(ptr+0)+1) = 2;```上述代码通过指针 `ptr` 加上偏移量0和1,找到了数组`array` 的第一行第二列的元素,将其赋值为2。

数组和指针

数组和指针

● 数组:数组是具有一定顺序关系的若干对象的集合体,组成数组的对象称为该数组的元素。

▲ 每个元素有n个下标的数组称为n维数组。

▲ a[100]:下标从0开始,到99止,不能为100。

▲ a[i][j]:i为行标,j为下标。

● 数组的声明:数组类型数组名[表达式1][表达式2]……● 数组的使用:数组类型数组名[表达式1][表达式2]……● 数组的存储:数组元素在内存中是顺序、连续存储的。

● 数组的初始化:就是在声明数组时给部分或全部元素赋初值。

▲ int a[3]={1,2,3}; 等价于 int[]{1,2,3};▲ int a[5]={1,2,3}; //部分初始化,必须连续,不能间隔赋初值▲ int a[2][3]={1,2,3,4,5,6}; 等价于 int a[][3]={1,2,3,4,5,6} //给出全部的初值时,行标可省▲ int a[2][3]={{1,2},{3,4},{5,6}};● 数组作为函数参数▲ 使用数组名传递数据时,传递的是地址▲ 使用数组名做函数的参数,则实参和形参都应该是数组名,且类型要相同▲ 对形参数组的修改,也就是对实参数组的修改▲ int ss(int a[][4],int bb) 调用:ss(b,x); //b是数组,x传递的是第一维的维数● 对象数组▲ 声明:类名数组名[下标表达式]▲ 引用:数组名[下标].成员名▲ 当一个数组中的元素对象被删除时,系统会调用析构函数来完成扫尾工作。

● 指针:是对地址直接操作的手段。

动态内存分配和管理也离不开指针● 指针类型:用来存放内存单元地址的变量类型,就是指针类型。

● 指针变量的声明:数据类型 *标识符;● 与地址相关的运算——"*"和"&"▲ "*"称为指针运算符(也称解析(dereference)),表示获取指针所指向的变量的值,是一元操作符。

二维数组指针 参数

二维数组指针 参数

二维数组指针参数I understand that you are facing a problem related to passing a two-dimensional array pointer as a parameter in C programming. This can be a challenging task for many programmers, as working with pointers in general requires a good understanding of memory management and pointer arithmetic. However, once you grasp the concept, passing a two-dimensional array pointer as a parameter should become more manageable.我理解您遇到了一个关于在C编程中将二维数组指针作为参数传递的问题。

对于许多程序员来说,这可能是一个具有挑战性的任务,因为通常需要对内存管理和指针算术有很好的理解。

然而,一旦掌握了这个概念,将二维数组指针作为参数传递就会变得更加容易。

When passing a two-dimensional array pointer as a parameter in C, it is important to remember that a two-dimensional array is essentially an array of arrays. This means that each "row" of the array is itself an array of elements, and the whole structure is stored in memory as a contiguous block of data. Therefore, when you pass a pointer to atwo-dimensional array, you are actually passing a pointer to the first element of the first array in the two-dimensional array.在C语言中将二维数组指针作为参数传递时,重要的一点是要记住,一个二维数组本质上是一个数组的数组。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
以前一直有种误解:
二维数组的是数组的数组,所以数组的首地址是指向第一个元素指针,而这个元素又是一个数组,所以把数组首地址理解为指向指针的指针。
如int a[3][2];,以前一直认为a是一个指向int指针的指针,即是一个int**。最近发现这是错的。
如果int **p=a;编译就会报错。如果强制转换int **p=(int **)a,则使用p[i][j]访问数组元素时出错。
}
/*下面看看int**型的指针吧……*/
int **pA=(int **)a;/*a、pA类型不同,不强制转换编译会报错*/
/*下面运行时出错……*/
for(int i=0;i<3;++i)
{
for(int j=0;j<2;++j)
{
p[i][j];
}
}</span>
<span style="font-size: medium;">int a[3][2];
*尽管&a[0][0]、a、a[0]的数值相同……*/
for(int i=0;i<6;++i)
{
p[i];/*这样可以遍历所有元素*/
}
/*下面看看int**型的指针吧……*/
int **pA=(int **)a;/*a、pA类型不同,不强制转换编译会报错*/
/*下面运行时出错……*/
for(int i=0;i<3;++i)
int val=0;
for(int i=0;i<3;++i)
{
for(int j=0;j<2;++j)
{
a[i][j]=val++;
}
}
/*使用a[i][j]的方式显然可以正常访问该二维数组*/
/*下面使用指针直接访问பைடு நூலகம்当然是不是int**了……*/
int *p=&a[0][0];/*注意,此处使用int *p=a;或者int *p=a[0];是不对的,p的类型是int型指针,*a或者a[0]是int (*)[2]类型,编译会报错的,*
int *p=&a[0][0];/*注意,此处使用int *p=a;或者int *p=a[0];是不对的,p的类型是int型指针,*a或者a[0]是int (*)[2]类型,编译会报错的,*
*尽管&a[0][0]、a、a[0]的数值相同……*/
for(int i=0;i<6;++i)
{
p[i];/*这样可以遍历所有元素*/
首先,因为a的定义为int a[3][2];则a的类型是int* [3][2]数组类型,或者int* [][2],即指向大小为2的数组的指针,类型与int **不同,所以int **p=a;出错。
其次,考虑p[i][j]访问a的数组元素时出错的问题。当我们使用指向二维数组的指针的下标运算来访问数组元素时,如a[i][j],它等同于*(a+i*2+j);即必须要知道第二维的大小才能访问。考虑我使用p[i][j]的后果:p是int**,所以p[i]为*(p+i),而这个结果被视作一个指针,在这里记做pp=*(p+i),所以p[i][j]等同于pp[j]。最终的结果为*(pp+j),并将这个结果解释为一个int值。
{
for(int j=0;j<2;++j)
{
p[i][j];
}
}</span>
上面最后一部分pA[i][j]出错的原因如下:
如上所述:p[i]是*(p+i),即在p处移动i个类型单位大小(p的类型是int**,通常指针都是32位值吧……多数情况正好和int大小相同),所以正好移动i个int大小,假设i=0,j=1,则p[i]是0;那么p[i][j]就是0[1],相当于将地址4的值取出来解释为为int,地址4当然不允许用户程序访问,所以运行时错误……
<span style="font-size: medium;">int a[3][2];
int val=0;
for(int i=0;i<3;++i)
{
for(int j=0;j<2;++j)
{
a[i][j]=val++;
}
}
/*使用a[i][j]的方式显然可以正常访问该二维数组*/
/*下面使用指针直接访问,当然是不是int**了……*/
相关文档
最新文档