指针基础
一、什么指针[ps:地址=指针]
1、什么地址:
内存区的每一个字节都有一个编号,这就是“地址”
2、直接访问和间接访问
分水岭:指针
间接访问:即,将变量i的地址存放在另一个变量中。
二、什么是指针变量
存放地址的变量
定义:
基类型 *指针变量名;
备注:
1、基类型->指针变量所指变量的数据类型
2、“*”表示所定义的变量是指针变量
3、变量名是ptr,而非*ptr
例子:
int *ptr;
p_ws/pWs
使用:不能直接给一个指针变量赋值为整形
1、通过&运算符赋值
p_var= &var;
2、通过另外一个指针变量赋值
p_var1= p_var2;
3、通过NULL赋值
p_var1= NULL;代表空指针
备注:
&:取地址(&是一元运算符,它返回操作数的内存地址)
*:取值(*是 &的反运算符,它也是一元运算符,返回指针指向的内存位置中的值)
优先级和结合方向:“&”和“*”两个运算符的优先级别相同,但按自右而左方向结合
int*p_var1 = &a, *p_var2 = &b;
备注:
p_var:代表指针变量
*p_var:指针变量所指的变量
p_var1= &*p_var2; -> p_var1 = &b;
p_var1= *&p_var2;
*p_var1++和 (*p_var)++区别
int a = *p_var1++:
1、取得*p_var1的指
2、p_var1指针加1
指针的算数运算:
指针±整数 或者 指针 -指针
指针±整数:代表指针(+)向后偏移x位(根据指针数据类型),(-)向前偏移x位
指针 - 指针:代表两个指针变量的内存距离
备注:指针 + 指针 错误
指针的作用:
- 使程序简洁、紧凑、高效
- 有效地表示复杂的数据结构
- 动态分配内存
- 得到多于一个的函数返回值
三、什么是数组指针
数组指针:
是指数组的起始地址,也就是第一个元素的地址。数组的指针是个常量指针。
指针数组:
是指一个数组,里面的元素类型都是指针
因为:数组名是数组的首地址 == 数组名就是数组的指针所以:可以像操作指针那样操作数组名
例子:
int ary[] = {1,2,3,4,5,6,7,8,9,10};
ary+ 2 -> &ary[2]
&ary[2]-> &(*(ary + 2))
四、什么是字符串指针
字符串指针(指向字符串的指针)C语言中没有特定的字符串类型,
我们通常是将字符串放在一个字符数组中。
字符数组和字符串指针的区别:
字符数组存储在全局数据区或栈区,字符串存储在常量区。
全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,
而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
例子:
#include <stdio.h>
int main()
{
char *str = "Hello World!";
str = "I love C!"; //正确
str[3] = 'P'; //错误
return 0;
}