9,指针为什么要分类型
1),指针变量也是一个变量,也在内存中占据字节空间
无论什么类型的指针变量 都占8个字节
2),为什么要分类型
因为指针只能找到变量的低字节的地址
但是不知道操作几个字节的空间
定义类型 好知道操作几个字节 int 4 float 4 char 1 double 8
所以,一个变量指针职能存储和指针同类型的变量的地址
否则就会出错,通过指针操作的时候,会变多变少得读取字节数。
10,指针与整数的加减法
1),指针可以和整数相加减
int num = 10;
int *p1 = #
int *p2 = p1 + 1; (结果加了4个字节)(int是4个字节)
+1 不是指加一个字节 而是指加该类型占用的字节数
2),+ - 整数 = + - 整数*(类型占据的字节数)
11,指针与一维数组
int *p1 = arr;
遍历数组
1),第一种
int *p1 = arr;
for(int i = 0; i < length; i++){
printf(“%d”,*(p1+i));
}
2),第二种
for(int i = 0; i < length; i++){
printf(“%d”,*(arr+i));
}
3),第三种
int *p1 = arr;
for(int i = 0; i < length; i++){
printf(“%d”,*(p1++));
}
这种遍历方式 结束时 会改变p1代表的变量
不再指向第1个元素 ,而是最后一个元素
不能进行第二次变量
解决:重新赋值 int *p1 = arr;
4),第四种
arr代表数组的地址,所以不能更改arr
当函数的参数是一个数组的时候
在声明这个参数的时候,其实并不是创建一个数组
而是声明一个用来存储数组地址的指针变量
所以在函数的内部 是无法算出参数数组的长度
规范:如果函数的参数是一个数组,在声明参数的时候,不要写数组
而是写一个存储数组地址的指针变量
void test(int arr[], int length){} ❌
void test(int * arr, int length){} ✅
虽然效果一样 但是都是下面这样写的
12,指针数组
用来存储多个指针类型数据的数组
int * ps[4];
13,用指针访问二维数组
int a[][];
a[j] = *(*(a+i)+j)
14,二维数组指针定义 初始化
数据类型(*指针变量名)[二维数组列数]
int a[3][4];
int (*p)[4]; 定义一个数组指针 指向含4个元素的一维数组
p = a;
p++; 这时候 不是指向下一个元素 而是指向下一行
15,指针数组和俄日维数组指针的区别
int *pa [3]; 指针数组 存的是3个指针元素
int (*pa)[3]; 二维数组指针 :指向含3个元素的一维数组
16,字符串指针保存字符串
char * p1 = &ch 指针指向字符
char * p2 = “sdhkfsudhflskdj” 指针指向字符串
字符串指针:
定义:char *字符串指针变量名 = “字符串内容”
作用:用来保存字符串
这个字符串存储在常量区
1),使用字符数组来保存的字符串是保存在栈里面的 可读可写。
2),使用字符指针来保存字符串,保存的是字符串常量地址,常量区市只读的
不可以修改
char *str2 = NULL;
str2 = malloc(100);
scanf(“%s”,str2);
printf(“%s/n”,str2);
17,二位字符数组
char str3[][];
18,char类型的指针数组
char * name[3]={“asd”,“dsf”,“fdasf”};
|
|