目录
一、指针是什么?
二、指针和指针类型
(1)指针的类型决定了指针向前或向后跳过几个字节
(2)指针的类型决定了对指针解引用的时候访问几个字节
三、规避野指针
四、指针运算
(1)指针+-整数
(2)指针-指针=指针和指针之间元素的个数
(3)指针的关系运算
五、指针和数组
一、指针是什么?
指针是内存单元中一个最小单元的编号,即地址。
口语中所说的指针是指指针变量,是用来存放内存地址的变量。
案例:
#includeint main() { int a = 10;//在内存中开辟一块空间 int* p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符 //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个指针变量 return 0; }
另外,在32位机器上,指针变量大小是4个字节;在64位机器上,指针变量大小是8个字节。
二、指针和指针类型
char* pc = NULL;//存放char类型变量的地址
int* pi = NULL;//存放int类型变量的地址
short* ps = NULL;//存放short类型变量的地址
long* pl = NULL;//存放long类型变量的地址
float* pf = NULL;//存放float类型变量的地址
double* pd = NULL;//存放double类型变量的地址
(1)指针的类型决定了指针向前或向后跳过几个字节
案例:
#includeint main() { int n = 10; char* pc = (char*)&n; int* pi = &n; printf("%pn", &n); printf("%pn", pc); printf("%pn", pc + 1); printf("%pn", pi); printf("%pn", pi + 1); return 0; } //仔细观察结果: //000000443A2FF7F4 //000000443A2FF7F4 //000000443A2FF7F5 //000000443A2FF7F4 //000000443A2FF7F8
(2)指针的类型决定了对指针解引用的时候访问几个字节
案例:
#includeint main() { int n = 0x11223344; char* pc = (char*)&n; int* pi = &n; *pc = 0; //重点在调试的过程中观察内存的变化。 *pi = 0; //重点在调试的过程中观察内存的变化。 return 0; }
三、规避野指针
(1)指针初始化
(2)小心指针越界
(3)指针指向空间释放时置NULL
(4)避免返回局部变量的值
(5)指针使用之前检查有效性
四、指针运算
(1)指针+-整数
#define N_VALUES 5
float values[N_VALUES];
float* vp;
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;//*vp=0;vp++
}
(2)指针-指针=指针和指针之间元素的个数
int my_strlen(char *s)
{
char *p = s;
while(*p != ' ' )
p++;
return p-s;
}
(3)指针的关系运算
for(vp = &values[N_VALUES]; vp > &values[0];)
{
*--vp = 0;
}
#define N_VALUES 5
float values[N_VALUES];
float* vp;
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;//*vp=0;vp++
}
(2)指针-指针=指针和指针之间元素的个数
int my_strlen(char *s)
{
char *p = s;
while(*p != ' ' )
p++;
return p-s;
}
(3)指针的关系运算
for(vp = &values[N_VALUES]; vp > &values[0];)
{
*--vp = 0;
}
for(vp = &values[N_VALUES]; vp > &values[0];)
{
*--vp = 0;
}
只允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较。
五、指针和数组
数组名表示的是数组首元素的地址。
案例:
#includeint main() { int arr[] = {1,2,3,4,5,6,7,8,9,0}; int *p = arr; //指针存放数组首元素的地址 int sz = sizeof(arr)/sizeof(arr[0]); for(i=0; i p+%d = %pn", i, &arr[i], i, p+i); } return 0; }



