引:/*函数指针三部曲,一声明,一赋值,一调用**/
Strcpy弱点
函数内部char *,char []
数组指针的赋值:
//详细代码
#include "stdafx.h"
#include "指针1.h"
//#include <include/string.h>
#include "string.h"
void test_strcpy(){
char Ch_a[10]="123456789";
char Ch_b[10];
strcpy(Ch_b,Ch_a);
printf("%s \n",Ch_b);//竟然没有赋值结尾,也有值。。
}
char * m_returnStr1(){
char Ch_a[]="i am str1";
return Ch_a;
}
char * m_returnStr2(){
char * Ch_b="i am str2";
return Ch_b;
}
void test_局部函数声明数组or指针(){
printf("first inside array\n");
//char* Ch_a,Ch_b;//看来声明为
char *Ch_a;
char *Ch_b;
Ch_a=m_returnStr1();
printf("%s\n",Ch_a);
printf("%p\n",Ch_a);
printf("now inside pointer\n");
Ch_b=m_returnStr2();
printf("%s\n",Ch_b);
printf("%p\n",Ch_b);
//就如预料样,前者 在局部函数就是一个stack 变量,返回一个随机量。
}
//做完测试后,发现就 坚持 匹配观点,就是
//一句话 ,vs上面,跨纬度的位置,就是error..
//不用 管 教科书如何 如何 夸张。。
void 测试函数(){
printf("call fcuntion\n");
}
void test_函数指针1(){
/*函数指针三部曲,一声明,一赋值,一调用**/
void (*p)();
//p=测试函数;//p=..;p=&f都可以
*(int *)&p =(int)测试函数// //特点就是 包了一层,又解开。我认为。
;
(*p)();
}
void test_a_a地址区别(){
//来源 深入解剖
char Aa[5]={'a','b','c','d'};
char (*chP1)[5]=&Aa; //二阶?
printf("%p/n",chP1+1);//66结果当然 移 5个单位
//测试2 注意结合顺序,结果触发0页面异常,直接注释
//(*(void(*)())0)();
// (* (void(*)() )0) ();
/**************************************
数组指针的赋值: 无论维度大,相等,还是小,都不能吗?
**************************************/
//测试一段函数指针
//测试4
//由于报错,直接注释下面模块
//int a[5][5];
//int(*p)[4];
//p=a; //error C2440: “=”: 无法从“int [5][5]”转换为“int (*)[4]”
//printf("%p %p\n",&a[4][2],&p[4][2]);
//printf("a_ptr=%p, p_ptr=%p\n",&a[4][2],&p[4][2]);
////printf("%p,%d\n",&p[4][2]-&a[4][2],&p[4][2]-&a[4][2]);
//end
// char (*chP2)[5]=a;//在vs上,这种赋值,
todo // //error C2440: “初始化”: 无法从“char [5]”转换为“char (*)[5]”
//printf("%p/n",chP2+1);
//下面的用例无法通过。维度不同//无法从“char [5]”转换为“char (*)[10]”
//char (*chP11)[3]=&a;
//char (*chP12)[3]=a;
//printf("%p/n",chP11+1);
//printf("%p/n",chP12+1);
//char (*chP21)[10]=&a;
//char (*chP22)[10]=a;
//printf("%p/n",chP21+1);
//printf("%p/n",chP22+1);
}