1 问题
1.1 指针类型和普通类型之间的关系是什么?
1.2 如何看待"内存地址 + 长度 才能访问内存中的数据“ ?
1.3 不同类型的指针可以互相赋值?
2 指针的“军规”
Type* 类型的指针只保存Type类型变量的地址
禁止不同类型的指针相互赋值
禁止将普通数值当作地址赋值给指针
示例代码:
#include <stdio.h> #include <stdlib.h>
int main() { int i = 0; float f = 10;
int* pi = &f; float* pf = &f;
printf("pi = %p,pf = %p\n",pi,pf); printf("*pi = %d,*pf = %f\n",*pi,*pf); pi = i; // WARNING tips:类型不同不能赋值。 *pi = 110; // OOPS printf("pi = %p,*pi = %d\n",pi,*pi); return 0;
}
3 问题
编写函数交换两个变量的值,真的没有办法实现?
可通过指针(变量)间接地来交换两个变量的值。
3.1 问题分析
想要编写函数交换变量的值,那么,必须有能力在函数内部修改函数 外部的变量!!!
示例代码:
#include <stdio.h>
#include <stdlib.h>
void func(int* p)
{
*p = 100; // 修改内存中4字节的数据,即:修改一个整型变量的值
}
void swap(int* pa,int* pb)
{
int t = 0;
t = *pa;
*pa = *pb;
*pb = t;
}
int main()
{
int var = 0;
int a =1 , b = 2;
printf("1.var = %d\n",var);
func(&var);
printf("2.var = %d\n",var);
printf("3.a = %d, b = %d\n",a,b);
swap(&a,&b);
printf("4.a = %d, b = %d\n",a,b);
system("pause");
return 0;
}
4 问题
可利用指针从函数中 "返回"多个值 (return 只能返回一个值) !!!
示例代码:
#include <stdio.h>
#include <stdlib.h>
int calculate (int n,long long* pa,long long* pm)
{
int ret = 1;
if((1 <= n) && (n <=20))
{
int i = 0;
*pa = 0;
*pm = 1;
for(i= 1; i<=n;i++)
{
*pa = *pa + i;
*pm = *pm * i;
}
}
else
{
ret = 0;
}
return ret;
}
int main()
{
long long ar = 0;
long long mr = 0;
if(calculate(5,&ar,&mr))
printf("ar = %lld,mr = %lld\n",ar,mr);
system("pause");
return 0;
}
指针是变量,因此赋值时必须保证类型相同。
指针变量保存的地址必须是有效地址。
通过指针参数,、
能够实现函数交换变量的值
能够从函数中“返回”多个值