level 8
徐一凡_exe
楼主
Pchar,按楼主的理解,是”point char“(在楼主小学英语没学好之前,以为是”plus char“)
这是一个类似于指针链表的 无限字符串 类型,从名字上来看,就知道它是一个指针,指向许多 连续的char 的指针。(这是楼主的主观的口胡,如果坑到新人了,请提出来)
开始研究了。
研究的第一步是尝试,楼主尝试写了一个从文件里读取字符串,显示到屏幕上的小程序:
var s:pchar;
t:text;
begin
assign(t,'fp.ini');
readln(t,s);//Error: Can't read or write variables of this type
writeln(s);
close(t);
readln;
end.
显然,编译错了。Pchar不能用read读入!
该怎么修改呢?
经过楼主的不断调试,确定了错误,写了新的程序:
var a:array[1..9]of char;//代替Pchar为字符数组
t:file of char;//只有file才能适用于blockread,text是不行的。
begin
assign(t,'fp.ini');//为了让大家容易接受,故读取此文件
reset(t);
blockread(t,a,9);//一下子从文件里读取9字节到字符数组
writeln(pchar(@a));//强制类型转换:取数组的地址,送给Pchar,再输出Pchar。
close(t);
readln;
end.
程序输出:[Compile]
这正好和我们的fp.ini的第一行一模一样。
通过使用不同的地址,输出也不一样:
var a:array[1..9]of char;
t:file of char;
begin
assign(t,'fp.ini');
reset(t);
blockread(t,a,9);
writeln(pchar(@a+1));//右偏地址1字节
close(t);
readln;
end.
输出:Compile]
因为偏移了地址,故跳过了”[“
楼主又发现,如果用这样的方法使用Pchar,字符串与相对应的的字符数组的值是统一的:
var a:array[1..9]of char;
t:file of char;
s:pchar;
begin
assign(t,'fp.ini');
reset(t);
blockread(t,a,9);
s:=pchar(@a);//Pchar赋值为数组的首地址
writeln(s);//第一次输出
a[1]:='''';//修改数组
writeln(s);//对比输出
close(t);
readln;
end.
输出:
[Compile]
'Compile]
其实很好理解这个现象,难道大家学习指针时没遇到这样的困扰吗?
第一层研究到此为止,明天再继续。
编译器:Free Pascal IDE 2.0.4
(不是fpc.exe)
2017年04月20日 12点04分
1
这是一个类似于指针链表的 无限字符串 类型,从名字上来看,就知道它是一个指针,指向许多 连续的char 的指针。(这是楼主的主观的口胡,如果坑到新人了,请提出来)
开始研究了。
研究的第一步是尝试,楼主尝试写了一个从文件里读取字符串,显示到屏幕上的小程序:
var s:pchar;
t:text;
begin
assign(t,'fp.ini');
readln(t,s);//Error: Can't read or write variables of this type
writeln(s);
close(t);
readln;
end.
显然,编译错了。Pchar不能用read读入!
该怎么修改呢?
经过楼主的不断调试,确定了错误,写了新的程序:
var a:array[1..9]of char;//代替Pchar为字符数组
t:file of char;//只有file才能适用于blockread,text是不行的。
begin
assign(t,'fp.ini');//为了让大家容易接受,故读取此文件
reset(t);
blockread(t,a,9);//一下子从文件里读取9字节到字符数组
writeln(pchar(@a));//强制类型转换:取数组的地址,送给Pchar,再输出Pchar。
close(t);
readln;
end.
程序输出:[Compile]
这正好和我们的fp.ini的第一行一模一样。
通过使用不同的地址,输出也不一样:
var a:array[1..9]of char;
t:file of char;
begin
assign(t,'fp.ini');
reset(t);
blockread(t,a,9);
writeln(pchar(@a+1));//右偏地址1字节
close(t);
readln;
end.
输出:Compile]
因为偏移了地址,故跳过了”[“
楼主又发现,如果用这样的方法使用Pchar,字符串与相对应的的字符数组的值是统一的:
var a:array[1..9]of char;
t:file of char;
s:pchar;
begin
assign(t,'fp.ini');
reset(t);
blockread(t,a,9);
s:=pchar(@a);//Pchar赋值为数组的首地址
writeln(s);//第一次输出
a[1]:='''';//修改数组
writeln(s);//对比输出
close(t);
readln;
end.
输出:
[Compile]
'Compile]
其实很好理解这个现象,难道大家学习指针时没遇到这样的困扰吗?
第一层研究到此为止,明天再继续。
编译器:Free Pascal IDE 2.0.4
(不是fpc.exe)