指针和数组

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;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值