在c中用指针编写函数
writing function with pointers in c
我写了这段代码:
#include <stdio.h>
void transpose(int *Al[]){
int x=0;
int z=0;
int k=1;
while (*Al[z] != "[=10=]") {
int c=*Al[z];
if (c>x)
x=c;
z++;
}
printf("%d ",x);
for(int o=0;o<6;o++){
for(int i=0 ;i<x;i++ ) {
int *p = Al[i];
int l=*p;
if(k<l)
printf("%d ",*(p+k));
else
printf(" ");
}
k++;
printf("\n");
}
}
int main() {
int A[] = {5, -5, 14, 5, 2};
int B[] = {3, 6, 11};
int C[] = {4, 1, -3, 4};
int D[] = {6, 2, 7, 1, 8, 2};
int E[] = {2, 15};
int F[] = {3, 4, -2};
int *All[] = {A, B, C, D, E, F, NULL};
transpose(All);
}
该函数获取一个指向不同数组的数组我需要使用指针打印数组
输出应该是:
-5 6 1 2 15 4
14 11 -3 7 -2
5 4 1
2 8
2
但是此代码不打印任何内容。
它指向第一个值的数组也是数组的大小。
我试过了:
void transpose(int *Al[]){
int x=0;
int z=0;
int k=1;
for(int o=0;o<5;o++){
for(int i=0 ;i<6;i++ ) {
int *p = Al[i];
int l=*p;
if(k<l)
printf("%d ",*(p+k));
else
printf(" ");
}
k++;
printf("\n");
}
}
它起作用了,只是我需要替换循环中的五和六
5 是所有数组中最大的 -1,所以我会知道要打印多少行,6 到 All 中有多少数组,这样我就可以知道我应该打印多少列。有解决办法吗?
while循环中的条件
while (*Al[z] != "[=10=]") {
没有意义。表达式 *Al[z]
的类型为 int
而字符串文字 "[=16=]"
的类型为 char *
.
也不清楚为什么在这个循环中出现幻数6
for(int o=0;o<6;o++){
不需要显式计算列数,因为标记值等于 NULL
。
我可以建议例如以下解决方案
#include <stdio.h>
void transpose( int * Al[] )
{
int rows = 0;
for ( int **p = Al; *p != NULL; ++p )
{
if ( rows < **p ) rows = **p;
}
if ( rows ) --rows;
for ( int i = 0; i < rows; i++ )
{
for ( int **p = Al; *p != NULL; ++p )
{
if ( i + 1 < **p ) printf( "%2d ", *( *p + i + 1 ) );
else printf( " " );
}
putchar( '\n' );
}
}
int main(void)
{
int A[] = {5, -5, 14, 5, 2};
int B[] = {3, 6, 11};
int C[] = {4, 1, -3, 4};
int D[] = {6, 2, 7, 1, 8, 2};
int E[] = {2, 15};
int F[] = {3, 4, -2};
int *All[] = { A, B, C, D, E, F, NULL };
transpose( All );
return 0;
}
程序输出为
-5 6 1 2 15 4
14 11 -3 7 -2
5 4 1
2 8
2
我写了这段代码:
#include <stdio.h>
void transpose(int *Al[]){
int x=0;
int z=0;
int k=1;
while (*Al[z] != "[=10=]") {
int c=*Al[z];
if (c>x)
x=c;
z++;
}
printf("%d ",x);
for(int o=0;o<6;o++){
for(int i=0 ;i<x;i++ ) {
int *p = Al[i];
int l=*p;
if(k<l)
printf("%d ",*(p+k));
else
printf(" ");
}
k++;
printf("\n");
}
}
int main() {
int A[] = {5, -5, 14, 5, 2};
int B[] = {3, 6, 11};
int C[] = {4, 1, -3, 4};
int D[] = {6, 2, 7, 1, 8, 2};
int E[] = {2, 15};
int F[] = {3, 4, -2};
int *All[] = {A, B, C, D, E, F, NULL};
transpose(All);
}
该函数获取一个指向不同数组的数组我需要使用指针打印数组 输出应该是:
-5 6 1 2 15 4
14 11 -3 7 -2
5 4 1
2 8
2
但是此代码不打印任何内容。 它指向第一个值的数组也是数组的大小。 我试过了:
void transpose(int *Al[]){
int x=0;
int z=0;
int k=1;
for(int o=0;o<5;o++){
for(int i=0 ;i<6;i++ ) {
int *p = Al[i];
int l=*p;
if(k<l)
printf("%d ",*(p+k));
else
printf(" ");
}
k++;
printf("\n");
}
}
它起作用了,只是我需要替换循环中的五和六 5 是所有数组中最大的 -1,所以我会知道要打印多少行,6 到 All 中有多少数组,这样我就可以知道我应该打印多少列。有解决办法吗?
while循环中的条件
while (*Al[z] != "[=10=]") {
没有意义。表达式 *Al[z]
的类型为 int
而字符串文字 "[=16=]"
的类型为 char *
.
也不清楚为什么在这个循环中出现幻数6
for(int o=0;o<6;o++){
不需要显式计算列数,因为标记值等于 NULL
。
我可以建议例如以下解决方案
#include <stdio.h>
void transpose( int * Al[] )
{
int rows = 0;
for ( int **p = Al; *p != NULL; ++p )
{
if ( rows < **p ) rows = **p;
}
if ( rows ) --rows;
for ( int i = 0; i < rows; i++ )
{
for ( int **p = Al; *p != NULL; ++p )
{
if ( i + 1 < **p ) printf( "%2d ", *( *p + i + 1 ) );
else printf( " " );
}
putchar( '\n' );
}
}
int main(void)
{
int A[] = {5, -5, 14, 5, 2};
int B[] = {3, 6, 11};
int C[] = {4, 1, -3, 4};
int D[] = {6, 2, 7, 1, 8, 2};
int E[] = {2, 15};
int F[] = {3, 4, -2};
int *All[] = { A, B, C, D, E, F, NULL };
transpose( All );
return 0;
}
程序输出为
-5 6 1 2 15 4
14 11 -3 7 -2
5 4 1
2 8
2