1.指针的理解
1.针可以理解为存储的数据的地址或内存单元
2.地址存放在指针变量中
int a=10; int*pa=&a;这里pa为指针变量,存放了a的地址;
* 为解引用操作符,可以理解为指引pa找到a的地址,pa就=&a,而*pa=a;
注意:
• 32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
• 64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
• 注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。
3.
1. #include <stdio.h> int main() { int n = 0x11223344; int *pi = &n; *pi = 0; return 0; 2.#include <stdio.h> int main() { int n = 0x11223344; char *pc = (char *)&n; *pc = 0; return 0;调试我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节改为0。
指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。 ⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。
4. 指针+整数![]()
我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。
指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。
5.void*指针:可以接受任意类型地址,但不能直接进行+-整数或解引用运算;
⼀般 void* 类型的指针是使⽤在函数参数的部分,⽤来接收不同类型数据的地址,这样的设计可以 实现泛型编程的效果。使得⼀个函数来处理多种类型的数据。
6.
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = &arr[0]; int i = 0; int sz = sizeof(arr)/sizeof(arr[0]); for(i=0; i<sz; i++) { printf("%d ", *(p+i));//p+i 这⾥就是指针+整数 }利用指针+-整数来当作数组的地址;
7.指针与指针·
#include <stdio.h> int my_strlen(const char* s) { const char* p = s; while (*p != '\0') p++; return p - s; } int main() { printf("%d\n", my_strlen("abc")); return 0; }会打印出来3,s指向字符串首字符;
8.指针关系比较
#include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = &arr[0]; int sz = sizeof(arr)/sizeof(arr[0]); while(p < arr + sz) //指针的⼤⼩⽐较 { printf("%d ", *p); p++; } return 0; }看到的小笑话:电脑为什么会感冒?因为它的Windows开着,还没装杀毒软件。