指针

来源:互联网 发布:sql2000附加数据库错误 编辑:程序博客网 时间:2024/04/29 20:40

指向数组的指针

            int (*p)[5] = &a;

            *p = a;  p[0] = a;  P[0][0] = a[0]; p+1 = &a+1 = a[5];

  

指向函数的指针

         void f(int ); 

         void (*p)(int );

         p[0](3);

         *p();

a[5] = {1,2,3,4,5};

int *p=(int*)(&a+1);

cout << p[-1];

结果为5 . 也就是a[4]  数组是可以越界访问的,只要访问的内存是该程序自己的内存就行。

 

指针与动态内存分配

 

 

动态分配一段内存,当除了该指针的作用域时候,空间不会被释放,但是指针没了。这就是说内存泄露了。

 

这就涉及到作用域的问题了

在程序中有 代码块 有全局数据块 有堆区 有栈区

 

全局的变量和函数在别的文件中都可以加上extern 使用,但是static 是限定其只能在本文件夹下被使用,如果想要让别人访问需要两个地方都有extern。

静态局部都是在第一次进入代码块的时候被创建,职能在这里被访问。在main完之前被释放

静态的和全局的在main之前构建。

 

如char *p= (char*)malloc(20);

p = "123";

这是错误的因为p中存放的本来是堆区地址,一下子变成栈区地址了,就会造成内存泄露。

char atr1[]="string",str2[10],*str3,*str4="sting";
A.strcpy(str1,"hello");
B.strcpy(str2,"hello");
C.strcpy(str3,"hello");
D.strcpy(str4,"hello");
C. 按照str3的定义,它是一个指针,没有指向任何空间地址,也就是所谓的野指针,如果对他进行操作,将有可能写入未知的空间地址,将可能导致程序崩溃,会出问题的,正确的写法可以是向堆申请空间,char *str3 = (char *)malloc(10);或者让它指向某个栈上的地址,str3 = str1之类的。

 

D. 按照str4的定义,这是一个字符串常量,是分配在静态区域的,是无法再运行时修改的,所以不能对他进行strcpy。

 

是的 你不能定义 const char *p = "test"  因为它本身就是字符串常量。

 

 

 

 

结构体与联合体

大小

struct a{ int x; char y[10];}占据内存是16 = 4*4;

 

uion b{int x;char y[10];} 占据内存是 12;

 

#include <stdio.h>

 union my
{
  int a;
char b;
  char c;
}
main()
{
my  x;

x.b = 3;

x.c = 4;

 printf("%d",x.a);
}

因为 char 共占了int的4个字节,a全局初始化为00000000 00000000 00000000 00000000

00000000 00000000 00000100 00000011

输出的就是这个数据。

 

 

sizeof(enum_Var) = 4;

 

 

 

 

原创粉丝点击