C陷阱与指针

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,字符串长度不确定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值