C语言指针练习

程序运行的结果是什么呢?

1、

程序运行的结果是什么呢?
1.
int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int* ptr = (int*)(&a + 1);
	printf("%d,%d", *(a + 1), *(ptr - 1));
 
	return 0;
}

        解:指针加减数值n,等价于指针偏移n个单位。

        数组名a等价于指向数组a首元素的一个指针指向元素1。a+1向左偏移一个单位指向元素2。

        &a等价于指向整个数组的指针。ptr = (&a+1)向右偏移一个单位(单位变为整个数组)指向数组末尾。

        ptr-1 《===》ptr向左偏移一个单位(int)指向元素4.

2、

程序运行的结果是什么呢?

2.
struct Test
{
	int Num; 
	char* pcName; 
	short sDate;  
	char cha[2];  
	short sBa[4]; 
}*p;
 
int main()
{
	p = (struct Test*)0x100000;
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
 
	return 0;
}

解:p = (struct Test*)0x100000《====》结构体指针p指向0x100000

     p + 0x1 《====》指针向右偏移1个单位(单位为结构体大小20)0x100020
    (unsigned long)p + 0x1 《====》将p指针强转为无符号的长整型

        p+1 == 0x100001
    (unsigned int*)p + 0x1 《====》将p指针强转为无符号的指针型(32位系统指针位4)

        p+1 == 0x100004

程序运行的结果是什么呢?


3.

int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
 
	return 0;
}

 

解:int a[5][5]    a 一个元素个数为5的数组。每个元素是元素个数为5并为整形的数组。
    int (*p)[4] p指针指向一个元素个数为4的数组
    p = a  p指针指向a[0]
    &p[4][2] - &a[4][2], 求指针的偏移量

  &p[4][2] - &a[4][2] === -4

计算机以反码的方式储存数字

源码 

1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100

补码

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1011

反码

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100

f        f        f        f        f        f        f        f        f        f        f        f        f        f        f      c

程序运行的结果是什么呢?
4.
int main()
{
	char* c[] = { "ENTER","NEW","POINT","FIRST" };
	char** cp[] = { c + 3,c + 2,c + 1,c };
	char*** cpp = cp;
	printf("%s\n", **++cpp);//*cp[1] == *(c + 2) -> c[2]  
	printf("%s\n", *-- * ++cpp + 3);//
	printf("%s\n", *cpp[-2] + 3);//*cpp[-2] + 3 ==  *(*(cpp-2))+3
	printf("%s\n", cpp[-1][-1] + 1);//cpp[-1][-1] + 1  ==  *(*(cpp - 1) - 1) + 1
 
	return 0;
}

 解:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值