如下程序运行结果是
1.
int Change(int *pX)
{
int y = 8;
y = y - *pX;
pX = &y;
return 0;
}
int main()
{
int xx = 3;
int *pY = &xx;
Change(pY);// 值传递,不能改变指针
printf("%d\n", *pY);// 3
system("pause");
return 0;
}
函数调用时,涉及到值传递。实参经过子函数,计算出结果,并返回函数值给主函数。
函数传值:值传递和引用传递。
本质区别:值传递是将实参的副本传给函数,进行计算。
引用传递是将实参的地址传给函数进行计算。
直接区别:值传递不改变实参的值,而引用传递改变实参的值。
例如:
void swap(int a,int b); 值传递 主函数传进来的a,b即使经过操作,仍不改变a和b的值。
void swap(int &a,int &b);引用传值,主函数传来的a,b的地址,通过运算改变了啊a,b地址里面的内容,也就是可以改变a,b的值。
2.
char arr[2][4];
strcpy((char *)arr, "you");
strcpy(arr[1], "me");
arr[0][3] = '&';
printf("%s\n", arr);// you&me
1、strcpy是将后一个字符串(包括字符串结尾符号'\0')复制到前一个参数指向的位置
2、结果为you&me,因为arr[0][3]='&'将原来的arr[0][3]处的'\0'替换掉了,导致一直识别到下一个'\0'才结束。
3、arr[2][4]与arr[8]的内存布局是相同的。只是访问方式可以不同而已。
char arr[2][4]; 相当于: arr[][]={{'\0','\0','\0','\0'},{'\0','\0','\0','\0'}}; strcpy(arr,"you"); 之后 arr[][]={{'y','o','u','\0'},{'\0','\0','\0','\0'}}; strcpy(arr[1],"me"); 之后 arr[][]={{'y','o','u','\0'},{'m','e','\0','\0'}}; arr[0][3]='&'; 之后 arr[][]={{'y','o','u','&'},{'m','e','\0','\0'}}; 执行 printf("%s\n",arr);时, 把 arr 当做一维数组,即:arr[]={'y','o','u','&','m','e','\0','\0'}; 所以输出结果是:you&me
3. -27 在内存中的存储形式是
int main()
{
printf("%x\n", -27);// ffffffe5
system("pause");
return 0;
}
负数按补码存
补码 = (不考虑符号位)反码 + 1
8 位情况:
1001 1011 原码
x110 0100 反码
反码 + 1 -> 1110 0101 补码
4.
int fun(int x)
{
int count = 0;
while (x)
{
count++;
x = x&(x - 1);
}
return count;
}
int main()
{
printf("fun(2017)=%d\n", fun(2019));//fun(2017)=8
system("pause");
return 0;
}
5.
void main()
{
int a = 1;
int b = 2;
int t;
t = CIR(a + b); //a+b*a+b
printf("%d\n", t);//5
system("pause");
return ;
}
6.
unsigned long g_ulGlobal = 0;
void GlobalInit(unsigned long ulArg)
{
ulArg = 0x01;
return;
}
void main()
{
GlobalInit(g_ulGlobal);//形参只是实参的副本
printf("%lu",g_ulGlobal);//0
system("pause");
return;
}