1.程序的内存空间是由代码,数据和堆栈组成的,其中数据是指各个变量的值,例如int a,是事先在内存里开辟一个长度为四字节的内存空间,然后再进行例如赋值和运算的操作,指针是一个值为地址的变量,一般初始化形式是int *p,初始化的时候,p是指p是一个指针类型,而他和普通的变量不同的地方是,初始化的时候他并不会开辟内存空间,之后进行指向,例如p=&a,则这个时候p就是a 的值,p则是a的地址。
int*p;//p是一个指针,变量p的类型是int*
char*p//pc是一个指针,pc的类型是char*
char a[20];
int *ptr=(int *)a; //强制类型转换并不会改变a 的类型
ptr++;
int a,b;
int array[10];
int *pa;
pa=&a; //&a 是一个指针表达式。
int **ptr=&pa; //&pa 也是一个指针表达式。
*ptr=&b; //*ptr 和&b 都是指针表达式。
pa=array;
pa++; //这也是指针表达式。
2.数组的数组名其实可以看作一个指针。一般而言数组名array 代表数组本身,类型是int[10],但如果把类型是数array 看做指针的话,它指向数组的第0 个单元,类型是int* 所指向的组单元的类型即int。
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
value=array[0]; //也可写成:value=*array;
value=array[3]; //也可写成:value=*(array+3);
value=array[4]; //也可写成:value=*(array+4);
数据段的内存分为全局/静态存储区和常量存储区,都是在代码编译的时候就进行内存分配,其中常量(const)存储区是只读的全局变量,局部变量的const还是存放在栈上;全局/静态的变量则放在一个区域,这块空间在程序结束后释放;静态(static)内存,如static int a,其中初始化的全局变量和静态变量在一个区域,这块空间当程序运行结束后由系统释放。堆栈内存的区别则是堆由程序员操作,栈由编译器操作,函数形参和局部变量在这里进行运算,结束之后进行去栈。
viod func()
{
static int n=4;//静态变量只初始化一次
cout<<n<<endl;
++n;
}
函数的调用中,形参是进行值的调用,所以不会对原来的值造成影响,但是使用指针,传入值是地址,进行地址操作则能操作到函数以外其他数据段的数据。
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main{
int a=10,b=20;
printf("a=%d,b=%d\n",a,b);//输出a=10,b=20
swap(a,b);
printf("a=%d,b=%d\n",a,b);还是输出a=10,b=20
return 0;
}