指针
#include 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
main(int argc,char *argv[])
{int i,len=0;
for(i=1;ilen+=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)