1.指针同级传递问题
这里在test01中容易出现p1指针移动,p指针也会移动错误,此时p1指针仅起拷贝作用。
由此我们可以理解为当arr数组名做实参时,形参接收可以用int arr[ ]或者int *arr接收,本质上是将arr的地址做实参传递给了形参,函数中对arr做操作实质上在对地址内容操作,或改变arr内容。
void test02(int *p2)
{
for(int i=0;i<4;i++)
*(p2+i)=0;//会改变数组的值
}
void test01(int *p1)
{
p1+=3;//此时的p1是临时拷贝,移动p1指针并不会影响主函数中p位置
}
int main()
{
int arr[4]={1,2,3,4};
int *p=a;
test01(p);//同级传递将地址传入p1,所以p1指针移动不会改变p的位置,但p1与p操作的地址是唯一的,
return 0;
}
2.int k=3, s[2]; s[0]=k; k=s[1]*10;
解释一下这段代码:首先s[0]给到了3;但是s数组并没有在创建时初始化,也就是s[1]是随机值
所以结果k为随机值。
3.fun(&arr[1]);//实质上传递的是arr[1]的地址,相当于arr[1]为一个数组的新开始。
可以用fun(int x[ ])接收,或者fun(int x[任意数])接收
4.对于这段代码,首先*ptr一直没有动,所以结果为6,10;
int main()
{
int arr[] = { 6,7,8,9,10 };
int* ptr;
ptr = arr;
*(ptr + 2) += 2;
printf("%d,%d\n", *ptr, *(ptr + 2));
}
5.这道题结果为4 4 3,由此可见前置++优先级高于*,先++;
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int* p=arr;
p += 2;
printf("%d\n",*++p);
printf("%d\n",++*p);
printf("%d\n",*(p++));
}
6.题目:使p指针指向元素为36
答案:p+=7 //要注意的是只需要 移动p指针,并不需要解引用
int a[10]={19,23,44,17,37,28,49,36,},*p;
p=a;
7.这道题也是经典例题,在sum中赋值操作会改变数组内容的,结果为44445678910
void sum(int* A)
{
A[0] = A[1];
}
int main()
{
int aa[10] = { 1,2,3,4,5,6,7,8,9,10 }, i;
for (int i = 2; i >= 0; i--)
sum(&aa[i]);
printf("%d\n", aa[0]);
}
8.这道题运行会后报错,p指向6,q指针指向NULL;不可以解引用!!这个一定要注意
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9,10,11,12, }, * p = a + 5, * q = NULL;
*q = *(p + 5);
printf("%d %d\n", * p, * q);
}
9.第1,2,3是对的,第4个&aa[0]的地址后不能赋值,不能给一个地址常量赋值;
int main()
{
int aa[8] = { 1,2,3,4,5,6,7,8 };
printf("%#p \n", &aa[0] + 1);
printf("%#p \n", &aa[1]);
printf("%#p \n", aa+1);
printf("%#p \n", &aa[0]++);
}
10.char[ ]={0,1,2,3,4,5}; 一维数组
char a[ ]="xyz",b[ ]={'x','y','z'}
a的数组长度为4,字符串长度为3
b的数组长度为3,字符串长度不确定