int *ptr=(int *)(a+1)问题的探讨
生活随笔
收集整理的這篇文章主要介紹了
int *ptr=(int *)(a+1)问题的探讨
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
int *ptr=(int *)(&a+1)問題的探討
#include<stdio.h>
int main(void)
{?
int a[5] = {1, 2, 3, 4, 5};?
int *ptr1 = (int*)(&a + 1); //&a指針指向的元素為整個(gè)數(shù)組,故加為sizeof(數(shù)組)?
int *ptr2 = (int*)((int)a + 1); //a地址再加一個(gè)字節(jié),直接地址值相加而不是指針?
int *ptr3 = (int*)(a + 1); //a為數(shù)組首元素的地址,a+1為數(shù)組第二個(gè)元素的地址?
printf("%x %x %x\n", ptr1[-1], *ptr2, *ptr3);?
return 0;
}
1)地址 ?0-3 ?4-7 ?8-11 12-15 16-19 ?20-23
? ?數(shù)值 ? 1 ? ?2 ? ?3 ? ? 4 ? ? 5?
? ?&a指針指向的元素為整個(gè)數(shù)組,故加為sizeof(數(shù)組),故&a+1 就是地址為20的地方
? ?*ptr1[-1]就是20-4=16這個(gè)地方,因?yàn)橐粋€(gè)Int 占用4個(gè)地址。
2)(int*)((int)a + 1);表示:a地址再加一個(gè)字節(jié),即地址為1,直接是地址值相加而不是指針。跟a+1不一樣,而a+1的地址是4。所以*ptr2表示的是指向地址為1的指針地址。
3)(int*)(a + 1);表示:a為數(shù)組首元素的地址,a+1為數(shù)組第二個(gè)元素的地址。所以*ptr3表示的是指向地址為4的指針地址。
#include<stdio.h>
int main(void)
{?
int a[5] = {1, 2, 3, 4, 5};?
int *ptr1 = (int*)(&a + 1); //&a指針指向的元素為整個(gè)數(shù)組,故加為sizeof(數(shù)組)?
int *ptr2 = (int*)((int)a + 1); //a地址再加一個(gè)字節(jié),直接地址值相加而不是指針?
int *ptr3 = (int*)(a + 1); //a為數(shù)組首元素的地址,a+1為數(shù)組第二個(gè)元素的地址?
printf("%x %x %x\n", ptr1[-1], *ptr2, *ptr3);?
return 0;
}
1)地址 ?0-3 ?4-7 ?8-11 12-15 16-19 ?20-23
? ?數(shù)值 ? 1 ? ?2 ? ?3 ? ? 4 ? ? 5?
? ?&a指針指向的元素為整個(gè)數(shù)組,故加為sizeof(數(shù)組),故&a+1 就是地址為20的地方
? ?*ptr1[-1]就是20-4=16這個(gè)地方,因?yàn)橐粋€(gè)Int 占用4個(gè)地址。
2)(int*)((int)a + 1);表示:a地址再加一個(gè)字節(jié),即地址為1,直接是地址值相加而不是指針。跟a+1不一樣,而a+1的地址是4。所以*ptr2表示的是指向地址為1的指針地址。
3)(int*)(a + 1);表示:a為數(shù)組首元素的地址,a+1為數(shù)組第二個(gè)元素的地址。所以*ptr3表示的是指向地址為4的指針地址。
總結(jié)
以上是生活随笔為你收集整理的int *ptr=(int *)(a+1)问题的探讨的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试系统存储是大端模式还是小端模式的方法
- 下一篇: 枚举enum与#define 宏的区别?