研究问题:
- 函数参数问题(一级指针与二级指针)?区分实参与值参?
- 指针变量的赋值和做函数的参数??
- 指针到底是变量,还是地址???
- 指针变量需要另外开辟内存存储?
要点:
- http://blog.chinaunix.net/uid-20361370-id-1962457.html
- 指针变量有时也可以简称为”指针”(大多数情况下),它是存放它所指向的变量的地址的变量. 那么,既然它本身也是一个变量,那就肯定也需要开辟一块块空间来存放它本身,这就是二级指针的概念了。
“指针”和”地址”到底相不相等, 在不同的语义环境中,结论是不同的。 - 指针变量的值就是某个变量的地址,无需另外开辟内存存储,指针就是按照指针变量的值(某个变量的地址)从而找到存储单元中的内容!!
同理,二级指针、多级指针就是按照上一级指针所指向的地址来寻址查找存储单元中的内容!!
截图展示区:
- 1.
#include<stdio.h>
#include<malloc.h>
void myMalloc(char **s)
{
*s=(char *) malloc(100);//S指向的是P的地址,所以改变了P所指的内存单元.
}
int main()
{
char *p=NULL;
myMalloc(&p); //这里的p可以得到正确的值了
if(p) free(p);
}
形参:出现在函数定义中,在整个函数体内都可以使用,实参出现在主调函数中,形参和实参的功能是作数据传送。
值参:只传递数值,在过程(函数)中对之所进行的改动,不会造成原始变量值的改变. 与之相对的是 地址参数,传的是变量地址,所以在函数中的任何改动都会影响到主函数的实际参数。
2. 指针引用与二级指针
#include<stdio.h>
int f1(int *&q){ //f1(int *q)
*&q=(int *)0xEEEEEEEE; //q=(int *)0xEEEEEEEE;
printf("传入指针引用的形参\n");
return 0;
}
int f2(int **q){
*q=(int *)0xFFFFFFFF;
printf("传入指针地址的形参\n");
return 0;
}
int main()
{
int i=10;
int *p=&i;//相当于int *p;p=&i;
printf("%#p\n",p);
f1(p);
printf("%#p\n",p);
f2(&p);
printf("%#p\n",p);
return 0;
}
运行结果:
3. 指针变量的赋值和做函数的参数
4. 指针变量需要另外开辟内存存储?
#include<stdio.h>
//一级指针,二级指针,常量
int main()
{
int *p;
int **t;
int i=10;
p=&i;
t=&p;
printf("%p\n",p);
printf("%p\n",&i);
printf("%p\n",*t);
}
运行结果:
PS:地址都一样,说明没有另外开辟内存来存储指针变量!!!只是把指针指向了一个内存块而已,自身并不需要内存单元存储!!