//形参是指针变量,实参是数组首地址的例子。
//编一个函数,统计并返回形参所指向的字符串长度。
//在主函数中输入字符串,调用该函数统计字符串长度并输出。
#include <stdio.h>
#include <stdlib.h>
extern int charlength(char *ps)
{
int length=0;
while(*(ps+length)!='\0')
{
length++;
}
return(length);
}
void main()
{
char *pc;
printf("请输入一个字符串:");
scanf("%s",pc); //编译时提示这里出错。错在哪里?难道不能用scanf()函数输入字符串后赋给字符型指针变量?
printf("\n\n您刚才输入的字符串%s长度为:%d。\n\n",pc,charlength(pc));
system("pause");
}
由于要存放数据,C语言必须在数据定义语句中先初始化,预先确定存储空间的大小才可以,比如char *pc="abcd"是可以的。
那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?
pc没有初始化
改成
char place[256];
char *pc=place;追问
那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?
因为"abcd";在编译的时候分配了一个只读的内存。
你改成
char *pc;
pc="abcd";
还是不能调scanf
此时pc指向的地址的内容是不能修改的
只有我说的那种方式才行
改为char *pc=(char*)malloc(sizeof(char)*100);追问
那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?
scanf("%s",pc);//表示从标准输入文件文件中读取一个字符串到以pc为首地址的一段内存中;
char *pc;
pc="abcd";//表示将字符串常量“abcd”写入通常是程序中的只读内存区内,并将其首地址赋值给pc;
以上两个本质上有区别!
那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?
那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?
"abcd",在内存中,存储的是一个字符串首地址,不要被外表所迷惑。所以,字符串在表达式中,它是作为一个指针参与运算的。
例1:“xyz”+1; 这行代码看上去像是垃圾,因为它试图在一个字符串上面执行某种类型的加法运算。但是,当你记得字符串常量实际上是个指针时,它的意义就变得清楚了。这个表达式计算“指针值加上1”的值。它的结果是个指针,指向字符串中的第2个字符:y。
例2:printf("%c",*"xyz"); 输出结果:x