指向数组的指针
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;