C语言问题汇总

指针

#include <stdio.h>

int main(void)

{

    int a[4] = {1,2,3,4};

    int *p = &a+1;

    int *p1 = a+1;

    printf("%#x,%#x",p[-1],*p1);

}

以上代码中存在错误。

    int *p = &a+1;

错误1:取a数组的地址,然后+1,即指针跳过int [4]大小的字节:4*4个字节。

(本题有别的意图,但是这种赋值是不正确的,而且赋值之后p指向的是未定义的空间。)

错误2:int * p定义的是一个指向整型变量的指针,然而在赋值的过程中,试图将一个数组的地址赋值给整型指针。

正确写法        int *p[4] =&a+1;)使用数组指针接收数组a的地址。

解释:int *p = a + 1;代表数组的地址从首元素,偏移一个sizeof(int)的空间,,指向数组中的第二个元素。

p[-1]代表指针向上偏移一个sizeof(int)的大小。此时刚好指向了数组中的最后一个元素。

例:int a[5],*p=a;

*(&a+I) 同理可得:取a的地址偏移了 I 整个数组的大小空间。


问题:

#include <string.h>
main(int argc,char *argv[])
{int i,len=0;
for(i=1;i<argc;i++)

len+=strlen(argv[i]);
printf("%d\n",len);
}
程序编译连接后生成的可执行文件是ex1.exe,
若运行时输入带参数的命令行是:
ex1 abcd efg 10<回车>
则运行的结果是__9____。

分析:输入的abcd efg 10 作为函数的参数,本题实现的功能主要是求和数组中字符串的总长度。明确可执行文件exe命令行输入作为函数的参数传递。


分析:首先定义了数组指针int (*p)[3];此时p的第一个元素指向的二维数组首元素的位置。

A :(p+i)表示指针偏移int【3】的大小,即在数组中跳过i行。然后在*(p+i)代表第i行的数组变量名。在+j可表示第j列元素。

s【0】【0】s【0】【1】s【0】【2】
s【1】【0】s【1】【1】s【1】【2】

B:p【I】与*(p+I)的含义相同。

D: x相当于p【i】【j】


f(int  *b , int m,  int n)
{ int  i,s=0;
for(i=m;i<n;i=i+2) s=s+*(b+i);
return s;
}
main()
{int x,a[]={1,2,3,4,5,6,7,8,9};
x=f(a,3,7);
printf("%d\n",x);
}


A) 10    B)18    C) 8      D) 15

函数分析:

首先函数的传递参数是3,7,那么s = *(a + 3),此时表示的是从a【0】偏移3位

即a【3】 ==  4;a【5】 == 6;

s = 4+6;


以下程序段的输出结果是(B )

char s[]="\\141\141abc\t";

printf ("%d\n",strlen(s));

A) 9   B) 12   C) 13   D) 14

函数分析:\141也是一种转义字符。

因此字符串的长度应该是9;


若有说明:int i, j=2,*p=&i;,则能完成i=j赋值功能的语句是(B  )

A) i=*p; B) *p=*&j; C) i=&j; D) i=**p;

分析:对j取地址 之后再*         表示的是j的本身。

那么*p = j;


void fun(char *a, char *b)

{

 a=b; (*a)++;

}
void  main()
{

char c1='A',c2='a',*p1,*p2;
p1=&c1; p2=&c2; fun(p1,p2);
printf("%c%c\n",c1,c2);
}
输出的结果是什么?Ab        //c1并未被改变,而p1指向c2进行*运算改变了c2的值。

分析:其中char * format = "%s,a= %d,b = %d\n",为格式字符串,定义字符串的输入格式,

printf(“%s a = %d,b =%d、n”,“a+=b”,a,b)

#define N 3
#define M 4
void LineMax(int  (*x)[M])
{ int i,j,p;
 { p=0;
for(j=1; j<M;j++)
if(x[i][p]<x[i][j])
 【 p++   】 ;
printf("The max value in line %d is %d\n", i, 【 x[i][p]  】 );
}
}
main()
{ int x[N][M]={1,5,7,4,2,6,4,3,8,2,3,1};
【LineMax (x)】 
}

该函数实现的是寻找每一行中的最大数。

for (int j = 1; j < M; j++)

{

         if (x[i][p] < x[i][j])  

                p = j;

printf("The max value in line %d is %d\n", i, x[i][p]);

}

分析:循环遍历i行的元素,如果x[i][j]的数字比前一个数字大,那么此时最大的元素默认为 x[i][j]

循环的结束条件是:直到for循环遍历i行中的每一个元素,结束之后打印记录下来的第j个元素,此时为p,输出即可。

宏定义

错误结论:一个#include命令中可以指定多个被包含文件

分析:一个include只能指定一个被包含的文件,多个文件需要多个include来进行指定。


在C语言中,可以使用#undef指令来提前解除宏定义的作用。#undef指令用于取消先前的宏定义,使得其后续的代码不再受该宏定义的影响。

例如,如果你有以下的宏定义:

#define MY_MACRO 100

你可以使用#undef指令来取消该宏定义:

#undef MY_MACRO

之后,该宏定义就会失效,不能再在后续代码中使用。

分析:需要注意的是,#undef指令只能取消一个先前的宏定义,而无法取消宏定义的作用范围。宏定义的作用范围仍然是整个源文件,直到文件结束或者遇到另一个#undef或重新定义的宏。

自增自减

int main(void)

 { nt i=9;

1        printf("%d\n",i--);9

2        printf("%d\n",-i++)-8;

3        printf("%d\n",-i--);7        //-9

解析:2、此时i 的值为8。这里的“-”表示负号运算符。因此先打印-i 的值,再i自增1。因此输出-8,并且i的值也变为9。

注意用和自增的过程:是先用来做运算,无论是打印还是负号运算,之后在i的基础上自增 8+1。

3、先打印-i,即-9,然后i自减1,即语句执行以后i = 8;

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值