一、指针
1)pa和&a同取a的地址。要获得a的值用*pa。
在64位下指针大小为8个字节,在32位下指针大小4个字节。
代码如下(示例):
int main()
{
int a = 10;
int* pa = &a;
printf("%p\n", &a);
printf("%p\n", pa);
*pa = 20;//* - 解引用操作
printf("%d\n", a);
return 0;
}
2)指针类型其实是有意义的
- 指针类型决定了,指针进行解引用操作的时候,一次性访问几个字节,访问权限的大小
如果是char的指针,解引用访问1个字节
如果是int的指针,解引用访问4个字节
float* ----------------- 4个字节 - 指针类型决定指针的步长(指针+1到底跳过几个字节)
字符指针+1,跳过1个字节
整型指针+1,跳过4个字节
{
int* pa = &a;
char* pc = &a;
printf("%p\n", pa);
printf("%p\n", pa+1);
printf("%p\n", pc);
printf("%p\n", pc+1);
return 0;
}
3)野指针。
很危险操作,没有给指针指定位置,是随机的。有数组越界错误之类的。
指针指向空间释放。当函数中申请了空间但是是临时变量函数结束时把空间还回去了。因此在主函数中再用*p=这个空间,是不可以的,这也是野指针。
正确书写指针格式。
int a = 10;
int* pa = &a;//指针的初始化
int* p = NULL;//NULL - 空指针,专门用来初始化指针
if (p != NULL)
{
}
4)指针运算
1.指针+_运算
2.指针——指针。下面结果为9.
int main()
{
char ch[5] = {0};
int arr[10] = { 0 };
printf("%d\n", &arr[0] - &arr[9]);
//printf("%d\n", &arr[0] - &ch[4]);!!错误,必须要指向同一空间
return 0;
}
求字符串长度:
//写一个函数求一个字符串的长度
//1. 计数器
//2. 递归
#include <string.h>
//1.strlen()直接找长度
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int my_strlen(char* str)
{
char* start = str;
while (*str != '\0')
{
str++;
}
return str - start;
}
int my_strlen(char* str)
{
char* start = str;
while (*str++ != '\0')
;
return str - start - 1;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
3.指针的关系运算:用地址比较大小
但是:注意2以后最好不用。标准并不保证他可行。
5)指针和数组
联系:
int main()
{
//打印1~9
int arr[10] = { 0 };
int* p = arr;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//赋值
for (i = 0; i < sz; i++)
{
*p++ = i + 1;//*p=i+1;
//p++;
}
//打印
p = arr;
for (i = 0; i < sz; i++)
{
printf("%d ", *p++);//p++
//*p
}
return 0;
}
int main()
{
1~10
int arr[10] = { 0 };
int* p = arr;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
赋值
for (i = 0; i < sz; i++)
{
*(p + i) = i + 1;
}
打印
for (i = 0; i < sz; i++)
{
printf("%d ", *(p+i));
}
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr+i));
printf("%d ", *(i+arr));
printf("%d ", i[arr]);!!错误
printf("%d ", arr[i]);
}
return 0;
}