数组和指针
2012-01-08 15:46
281 查看
先上题:
加一条打印语句,代码如下:
上一个程序打印*ptr是乱码,下一段代码打印ptr是100。建议将下面程序的数组a设置成全局变量,而不是局部变量。因为局部变量是在栈里面的,栈用于保存函数的局部变量和函数调用的环境变量,所以对栈内的没分配的空间乱调用也许会造成程序运行混乱。但是全局变量是在堆里分配的。
下面还有几个类似的:
int main() { int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a +1); printf("%d", *(ptr-1)); return 0; }对于这道题,我的第一感觉是输出1,但是实际是输出5,为什么呢???
加一条打印语句,代码如下:
int main() { int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a +1); printf("%X,%X\n",&a,&a+1); printf("%d\n", *(ptr-1)); return 0; }输出&a和&a+1,就可以知道当前ptr实际指向a[5]的位置(数组a实际只有5个数)而不是a[0]位置。我们可以打印看看:
#include <stdio.h> #include <stdlib.h> int main() { int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a +1); printf("%d\n",*ptr); printf("%d", *(ptr-1)); return 0; }
上一个程序打印*ptr是乱码,下一段代码打印ptr是100。建议将下面程序的数组a设置成全局变量,而不是局部变量。因为局部变量是在栈里面的,栈用于保存函数的局部变量和函数调用的环境变量,所以对栈内的没分配的空间乱调用也许会造成程序运行混乱。但是全局变量是在堆里分配的。
#include <stdio.h> #include <stdlib.h> int a[5] = {1,2,3,4,5}; int main() { int *ptr = (int *)(&a +1); a[5]=100; printf("%d\n",*ptr); printf("%d", *(ptr-1)); return 0; }这道题的关键在于理清&a的类型是in*,还是int*[5]。
下面还有几个类似的:
#include <stdio.h> #include <stdlib.h> typedef int y[5]; int main() { int a[5] = {1,2,3,4,5}; y *ptr = &a + 1; printf("%X\n",a); printf("%X\n",&a); printf("%X\n",&a+1); printf("%X\n",ptr); printf("%X\n",ptr-1); printf("%d", *((int*)(ptr-1))); return 0; }
#include <stdio.h> #include <stdlib.h> typedef int y[5]; int main() { int a[5] = {1,2,3,4,5}; y *ptr = &a + 1; printf("%X\n",a); printf("%X\n",&a); printf("%X\n",&a+1); printf("%X\n",ptr); printf("%X\n",ptr-1); printf("%d\n", *((int*)(ptr-1))); printf("%X\n",&a); printf("%X\n",*(&a)); return 0; }
#include <stdio.h> #include <stdlib.h> typedef int y[5]; int main() { int a[5] = {1,2,3,4,5}; y *ptr = &a + 1; printf("%X\n",a); printf("%X\n",&a); printf("%X\n",&a+1); printf("%X\n",ptr); printf("%X\n",ptr-1); printf("%d\n", *((int*)(ptr-1))); printf("%X\n",&a); printf("%X\n",*(&a)); printf("%X\n",*(*(&a))); return 0; }
#include <stdio.h> #include <stdlib.h> typedef int y[5]; int main() { int a[5] = {1,2,3,4,5}; y *ptr = &a + 1; printf("%X\n",a); printf("%X\n",&a); printf("%X\n",&a+1); printf("%X\n",ptr); printf("%X\n",ptr-1); printf("%d\n",*(*(ptr-1))); printf("%d\n", *((int*)(ptr-1))); printf("%X\n",&a); printf("%X\n",*(&a)); printf("%X\n",*(*(&a))); return 0; }
相关文章推荐
- 指针指向多维数组
- 一个数组指针的使用【一】
- [C++ Primer 第4版]第4章 数组和指针
- 数组指针和指针数组的区别
- iOS  日记2 --字符串赋值给指针与数组的区别
- 20151215C语言基础16_函数3(数组与指针)
- (学习日记)C++中用typedef来掩饰指针和数组
- C语言之数组和指针
- 字符数组 字符指针 sizeof strlen 的区别
- C语言的指向数组的指针
- c++ 函数 数组 传参 指针下标
- 数组<->指针<->动态数组之间的关系
- 数组到指针的隐式转换
- C++对象指针数组与堆中对象数组
- 从零开始学C++之从C到C++(二):引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
- 数组和指针的区别
- 指针与数组关系
- 字符串拼接 strcat ;数组和指针的区别
- 数组指针的定义
- 【C++基础】 指针&字符串&数组