指针
内存中最小的存储单元 : 字节 ,每一个字节在内存中都有一个编号, 这编号就是指针
指针作用 : 有了指针就可以访问它所指向的存储空间
*作用 : 1.在定义指针变量的时候 , 它就类型说明符, 它说明定义的这个变量是一个指针变量
2.如果不是在定义指针的时候 , 它是一个操作符 , 用在指针变量的前面是访问指针所指向的存储空间
&作用 : 取地址符 , 取出变量地址
指针 : 内存地址
有了指针就有了打开内存的钥匙 , 就可以操作这一块内存
指针变量 : 存放内存地址的变量
定义指针 : 指针所指向的数据类型 *指针变量名称;
在定义变量时候 , *是一个类型说明符 ,说明定义这个变量是指针变量
在不是定义的变量时候,*是一个操作符 , 访问(读,写)指针所指向那块存储空间
指针使用场景:通过被调函数 , 修改主调函数中某个变量的值
注意点:
1 . 只有定义没有初始化指针里面是一个垃圾值 , 这时候我们操作这个指针为野指针
2 . 如果操作一个野指针
2.1程序奔溃
2.2访问不该访问存储 , 操作潜在逻辑错误
3 . 不可以使用整形常量赋值一个指针变量
因为内存是操作系统分配我们的 , 不是我们随便取的
4 . 什么类型的指针 , 指向什么类型变量
5 . 多个指针可以指向同一变量
指针使用场景:
1.在被调函数中 , 通过形参来改变主调函数中某个变的值
2指针可以返回多个值
指针的初始化:
int num= 10; //先定义变量再进行初始化
int *p; //定义指针变量p
p = &num //p 指向 num
*p = 20;
三级指针 : 指向耳机指针的指针
int***ppp = &pp;
***ppp =40;
定义指针变量的同时进行初始
int num2= 20;
int *p2= &num2;
*p2 =40;
printf(“%d,%d\n”,num2,*p2);
//
int *p3= 10000; // 此处是错误的
int num= 10;
int *p =#
// pp 就是一个二级指针
int **pp = &p;
1.变量的地址是变量所占存储空间的首地址
2.指针变量仅仅可以存储一个地址编号, 如果没有类型 ,当通过指针就不知道要访问多少个字节存储空间.
3.指针区分类型是为了在通过指针访问它所指向存储空间的时候, 能够正确的访问.
4.如果通过一个小的char类型的指针操作一个int变量 , 如果这个值的二进制数据超过8位(1个字节), 那么就造成数据错误
5.如果通过一个int 类型的指针操作一个char变量 , 那么就会修改了你不该修改的内存 ,造成程序逻辑错误
多级指针:
二级指针 : 指向以及指针的指针
int nums = 10;
int*p = #
int**p = &p;
**p= 20;
指针变量
指针运算:
指针 + 整形数 == 指针变量中值+ sizeof(其所指向数据类型)
指针 - 整形数 == 指针变量中值- sizeof(其指向的数据类型)
pointer1- pointer2 = (pointer1中值 - pointer中值) / sizeof(指向的数据类型)
pointer+ num : 把指针向后移动 num 个它所指向的数据类型单元
pointer- num : 把指针向前移动 num 个它所指向的数据类型单元
赋值运算
=
+= 必须是一个整形数
-= 必须是一个整形数
比较运算
==
!=
>
<
>=
<=
int a=10;
int *p =&a;
p = p+1;
关系运算 ( 比较运算 )
pointer1== pointer2 : pointer1 与 pointer 指向同一地址
pointer1> pointer2 : pointer1 在 pointer2前面
pointer1< pointer2 : pointer1 在 pointer2后面
intnums[5] = {1,2,3,4,5};
int *pointer1 = num;
int *pointer2 = &num[4];
size_tsize = pointer2 - pointer1;
printf(“%lu\n”,size);
指针与数组(一维数组)
数组像一个指针 : 访问数组中元素
intnums[] = {1,2,3,4,5};
int *p = nums;
printf(“%d,%d,%d,%d,%d\n”,nums[1],p[1],*(nums+ 1),*(p +1), *(++p),1[nums]);
数组不是一个指针
1.sizeof(array)!= sizeof(pointer) : 当一个数组赋值一个指针变量的时候, 那么数组中有些信息就丢失了 ,比如数组长度 ,这种现象指针信息遗失
2.指针的指向是可以改变的 , 数组的指向是不可以改变的
3.array== &array 数组名就是数组地址,pointer != &pointer : 指针所指向的地址不是指针本身地址
指针与二维数组
1.指针数组 : 元素为指针的数组
指针类型 : 它所指向的数据类型
2.数组指针 : 指针数组的指针
指向一维数组的指针 : int (*pointer)[元素个数]
指向一维数组的指针它和二维数组对应
intnums[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
pointer= nums;
pointer++;
pointer+ 1;
pointer[1]+ 1;
相同点 对应地址都是一样的
不通点 : 指针类型是不同
nums + 1= nums + sizeof(num[0])
nums[0]+ = nums +sizeof(int)
for (inti =0; i < sizeof(nums) / sizeof(int);i++){
printf(“%d:,p[i]);
}