1.a与&a的区别
int a[5]
a指数组首元素的地址,即a[0]的地址
&a是数组的首地址
int main(int argc, char* argv[])
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
printf("%d,%d/n", *(a+1), *(ptr-1));
return 0;
}
运行结果:2,5
2.数组就是数组,指针就是指针
文件1中定义char a[100];
文件2中声明extern char *a;
这是错误的。
3.指针数组与数组指针
int *p1[10];
这是一个指针数组。它是一个数组,数组里存的元素为指针。
int (*p2)[10];
这是一个数组指针。它是一个指针,它指向一个数组,数组长度为10,数组中元素为int型。
4.数组与函数
当一维数组作为函数参数时,总是解析成一个指向其首元素的指针。
void fun(char a[10]);
void fun(char a[]);
上面两个声明无区别,实际传递的数组大小与形参指定的数组大小无关系。
5.无法将指针变量本身传递给一个函数
void GetMemory(char *p, int num) { p = (char*)malloc(num*sizeof(char)); } int main(int argc, char* argv[]) { char *str = NULL; GetMemory(str, 10); strcpy(str,"hello"); free(str);//free并没有起作用,内存泄露 return 0; } 解决以上问题,有2种方法: (1)用return
char* GetMemory(char *p, int num)
{
p = (char*)malloc(num*sizeof(char));
return p;
}
int main(int argc, char* argv[])
{
char *str = NULL;
str = GetMemory(str, 10);
strcpy(str,"hello");
free(str);
return 0;
}
(2)用二级指针
void GetMemory(char **p, int num)
{
*p = (char*)malloc(num*sizeof(char));
}
int main(int argc, char* argv[])
{
char *str = NULL;
str = GetMemory(&str, 10);
strcpy(str,"hello");
free(str);
return 0;
}
6.*(int *)&p
void function()
{
printf("call function!/n");
}
int main(int argc, char* argv[])
{
void (*p)(); //函数指针,指向形参和返回值均为void的函数
*(int *)&p = (int)function; //&p指指针变量本身的地址,(int *)&p把地址强制转换为int *类型
//(int)function表示函数入口地址强制转换为int型
//*(int *)&p = (int)function表示将函数的入口地址赋给指针变量p
(*p)(); //调用p所指的函数
return 0;
}