指针变量
int * pa=&a;
int:pa指向的a是int类型
*:代表pa是指针类型。
内存
32位的机器,其有32根地址线。32个线每一根可以代表0或1.一个地址就32bite,4个字节。
一共可以排列组合2^32种。你能有这么多的地址来储存数据。
2^32中的1为一个字节,32位机器能储存2^32/1024kb /1024MB /1024g=4g的容量。
32位机器指针大小是4字节。
指针类型的意义
int *的指针解引用访问四个字节。
char*的指针解引用访问一个字节。
short * 2个
float * 4个
double * 8个
结论:指针类型可以决定指针解引用 的时候访问多少个字节。(指针的权限)
规避野指针
1指针初始化
1)明确知道指针应该初始化 就直接初始化
2)不知道初始化为什么值,就初始化为NULL。
int *ptr =NULL(NULL必须包含头文件,<stdio.h>)
NULL为0。
ptr是一个空指针,没有指向任何有效的空间,这个指针不能直接使用。
if(ptr!=NULL)后才使用这个指针。
2不越界
3指针指向的空间释放后,及时置为NULL。
*(p+i)=arr【i】
指针相减:
指针减指针得到的数值的绝对值是指针和指针之间的元素个数。
直接等于元素下标相减。
指针相减的前提是两个指针指向了同一块空间。
strlen统计的是/0之前的字符个数。
\0的ascll码值是0,
指针规定
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
指针变量和数组的关系
指针变量的大小是4/8个字节。专门存放地址的。
数组就是数组,不是指针,数组是一块连续的空间,可以存放类型相同的数据。
联系:数组名是数组首元素的地址。数组名==地址==指针。
通过指针可以遍历访问数组的。
数组名是数组首元素地址,
但有两个例外,1)sizeof(数组名)2)&数组名
二级地址
int a=0;
int *p=&a;
int **p=&p 第二个*代表pp是一个指针变量。
int * 是说明pp是指向int * 的类型
指针数组
整形数组:存放整形的数组
字符数组:存放字符的数组
指针数组:存放指针(地址)的数组数组指针。。。
//二级指针模拟二维数组
#include <stdio.h>
int main()
{
int arr1[] = { 1,2,3,4,5, };
int arr2[] = { 2,3,4,5,6, };
int arr3[] = { 3,4,5,6,7, };
int* p[] = { arr1,arr2,arr3 };
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 5; j++)
{
//printf("%d,", p[i][j]);
printf("%d,", *(p[i] + j));
}
printf("\n");
}