1.指针变量的大小:
int main()
{
int num = 10;
int* p = #
char ch = 'w';
char* pc = &ch;
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(pc));
return 0;
}
在x86环境下,结果为4,4
因为在32位机器上,指针地址转换为数字信号,得到32个0/1组成的二进制序列,即为4个字节。
同理,在x64环境下,结果为8,8。
2.指针类型的意义:
2.1.指针的解引⽤
指针类型决定了指针在解引用时一次能操作几个字节,如:
2.2. 指针+-整数
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}
结果 char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。
例:用指针的方式访问整个数组:
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int* p = &arr[0];
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%d ", *p);
p++;
}
return 0;
}
3.const修饰指针:
3.1.const修饰变量
const可使变量无法修改,如n=20会报错;但可通过指针变量“越狱”:
int main()
{
const int n = 0;
printf("n = %d\n", n);
int*p = &n;
*p = 20;
printf("n = %d\n", n);
return 0;
}
3.2.const修饰指针变量
• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本⾝的内容可变。
eg: const*p---p=&m可行,*p=100不行
• const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。
eg: *const p---*p=100可行,p=&m不行
注:const放到 int 前后无影响 eg: int const *p==const int *p
4.指针运算:
4.1. 指针+-整数
p+1跳动字节数由指针类型决定,如int类型跳动4个字节。
4.2.指针-指针
就是地址-地址,结果为两指针间元素个数。
注:两指针必须指向同一块空间。
练习:求字符串长度
方法一:
my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
方法二:
my_strlen(char* str)
{
char* start = str;
while (*str != '\0')
str++;
return str-start;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
注:数组名就是数组首元素地址。
5.野指针:
概念:野指针就是指针指向的位置是不可知的。
5.1.野指针形成原因:
1.指针未初始化;int *p;
2.指针越界访问:
int main()
{
int i = 0;
int arr[10] = { 0 };
int* p = &arr[0];
for (i = 0; i < 11; i++)
{
*p = i;
p++;
}
return 0;
}
疑问:这种野指针指向位置是arr后面的地址还是不可知的?
实测,指向arr后面地址。
3.指针指向的空间释放:
int* test()
{
int n = 100;
return &n;
}
int main()
{
int*p = test();
printf("%d\n", *p);
return 0;
}