int *p = &a; // * 只是说明p是个指针变量
*p = 9; // * 是指针运算符,访问指针指向的变量a
栈(stack):存储临时变量,系统自动分配 。先进后出。
堆(heap):手动申请的内存(malloc),需手动回收(free)。
静态存储区域:常量、全局变量,不需要回收,直到程序结束运行。
代码存储区域:存放代码的。
1. 数组及其数组元素都占有存储空间,都有自己的地址,因此指针变量可以指向整个数组,
也可以指向数组元素。
2. 数组变量a是个 指针常量 ,里面存的是指针地址(例:int a[3];)
3. 指针常量a,指向的是数组里面第一个元素。
数组中的元素地址是连续的。
通过对数组指针做加法运算,指向不同的元素,实现遍历每一个元素。
int a[4] = {1,2,3,4};
int *p = a;
p++; //a++是错误的,因为数组名a是个常量。
a是指数组第一个元素的地址、&a是指整个数组的地址(虽然与a一样,但a+1指的是数组中第二个元素的地址,&a+1指整个数组的下一个位置的地址,大小是数组的大小。)
利用指针交换:
指针函数:返回值为一个指针的函数叫指针函数。
函数指针:指针也可以指向一个函数。
函数作为一段代码程序,在内存中也要占据部分存储空间。函数名就代表这函数的地址。
指向指针的指针:
void *指针:可以指向任意任何类型的指针。
注:p1指针变量虽然没有指定类型,但是 void *p1 = &a;赋值之后,那么p1中存的就是
a的地址,也就是一个int类型的指针地址。
野指针问题:指针定义时要初始化或指向NULL
运行出现:
因为没有结束符( ‘ \0 ‘ )
利用指针拷贝
1. 如下题,将数组a中的值拷贝到数组b3中
运行出现:
如果运行注释的内容则:
2.
方法二适用于target所指的指针指向没有分配内存。
3.
字符串与指针的区别
1. 字符数组声明的字符串可以修改其中的字符
以指针的方式声明的字符串,后面的字符串是常量,不能修改。
2. 把str2的内容拷贝到point2,数组指针要判断空值,并申请内存,最后释放内存。
使用库函数时要导入的包:
strlen--<string.h>
malloc--<stdlib.h>