char* 为什么是字符串指针?

时间:2021-04-11 14:44:04
char* 为什么是字符串指针?
怎么不能理解成char* 为什么是字符指针?
好像没有看到字符指针这种说法 为什么?

33 个解决方案

#1


字符,你知道吧?
字符串就是字符的集合,而字符串指针就是指向这些字符在内存的首地址。

#2


请问哪本书上说char*是字符串指针的?

#3


其实也可以理解成字符指针,现在的p就是指向第一个字符的,指针加1,就可以指向下一个字符.
字符串指针是相对于整个字符集合来说的.

#4



       #include <stdio.h>
       #include <stdlib.h>

       int
       main(void)
       {
       char c = 'a';
       char *p = &c;
       printf("%c\n",*p);
       return 0;
       }


这个是什么?

#5


int main()
{




char c='c';


char * p  = &c;



char str[] = "hello world" ;

cout << *p << endl;


p = str ;

cout << p << endl;



int j = 1;


p = (char*)&j;

cout << *p << endl;
return 1;



只是指向一个内存地址
看你怎么理解而已。


#6


你说的对,本质上讲,它是一个字符指针。

对于字符串来讲,它实际上是一个字符数组,数组的元素在内存上的储存位置是连续的,所以用字符数组的首地址就可以表示整个数组,C语言规定如果字符数组中有一个'\0',那这就是个字符串,所以char *可以表示一个字符串。
字符数组而并非字符串意义不大,字符串用的比较频繁。所以经常讲char *是一个字符串指针,当然 本质上它是一个字符指针

#7


char* 可以指向字符串的首地址

#8


对,可以理解。。。

比如:
char buffer[10];
其中,buffer是这一些列字符,整个字符串的首地址····

但是,其实,buffer只是指向了第一个,没有指向第二个,他们之间的关系你可以理解为:

几个兄弟,你知道老大的妻子,呵呵,根据妻子,得到老大,
哥几个站在一起,于是你知道了老三,老四的位置·~~

#9


学习了

#10


引用 2 楼 mstlq 的回复:
请问哪本书上说char*是字符串指针的?

那应该怎么理解
char buf[10] = "csdn";
char*   a = buf;

为什么cout << a << endl;的时候不是数组的首地址 而是数组的全部内容?
如果要输出a的地址如何做?

#11


指针想指什么都行。。不过编译器总唧唧歪歪

#12


其实叫字符串指针仅仅是习惯而已

#13


mark

#14


引用 10 楼 lfkoma 的回复:
引用 2 楼 mstlq 的回复:
请问哪本书上说char*是字符串指针的?

那应该怎么理解
char buf[10] = "csdn";
char*  a = buf;

为什么cout < < a < < endl;的时候不是数组的首地址 而是数组的全部内容?
如果要输出a的地址如何做?

用cout输出字符串的地址可以这样。 
char *p = "abc"; 
cout < < (void)*&p < < endl;
这是cout对象的特性啊,是cout对象故意写成这样的,不是错误。 

cout相比于c的printf,去掉了格式说明符,那么如何表示众多繁杂的格式呢,把cout设计得“智能”一点是一个可行的方案,至少iostream类的设计者是这样想的,cout的确比printf简单了不少。

#15


引用 3 楼 kouwenlong 的回复:
其实也可以理解成字符指针,现在的p就是指向第一个字符的,指针加1,就可以指向下一个字符.
字符串指针是相对于整个字符集合来说的.

没有什么字符串指针,只有字符指针,只是这个指针是指向字符串的首个字符的地址!

#16


引用 3 楼 kouwenlong 的回复:
其实也可以理解成字符指针,现在的p就是指向第一个字符的,指针加1,就可以指向下一个字符.
字符串指针是相对于整个字符集合来说的.

没有什么字符串指针,只有字符指针,只是这个指针是指向字符串的首个字符的地址!

#17


楼主这个问题问得好可爱

顶一个

#18


引用 10 楼 lfkoma 的回复:
引用 2 楼 mstlq 的回复:
 请问哪本书上说char*是字符串指针的?

 那应该怎么理解
 char buf[10] = "csdn";
 char*   a = buf;

 为什么cout  < < a  < < endl;的时候不是数组的首地址 而是数组的全部内容?
 如果要输出a的地址如何做?


这里对a 对行了隐式的类型转换。当cout发现形参是char * 型时,它净输出该地址所指向的字符串

#19


引用 10 楼 lfkoma 的回复:
 为什么cout  < < a  < < endl;的时候不是数组的首地址 而是数组的全部内容?
 如果要输出a的地址如何做?

operator overloading?

#20


就是字符指针啊,输出的时候看你用什么格式了
如果是%c,那么肯定是输出一个字符的
如果是%s,那么就输出直到碰到‘\0’才结束的

#21


引用 2 楼 mstlq 的回复:
请问哪本书上说char*是字符串指针的?

老谭
哪版我忘了
还是标题

#22


呵呵! 它其实就是一个指向地址的指针,就看你怎么看待了!

#23


字符指针和字符串指针其实是一个意思,当字符串只有一个字符时,指针就是它的地址;当有很多字符时,就是首地址。你看是不是一样了。

#24


引用楼主 lfkoma 的回复:
char* 为什么是字符串指针?
怎么不能理解成char* 为什么是字符指针?
好像没有看到字符指针这种说法 为什么?

常量指针,编译器在编译的时候,按照属性分别放在不同的区域

#25


是一连串常量地址空间的首地址···,
凡是试图写入那段内存··就会被报错···

#26


楼主:
    为何成为字符串指针,而不是字符指针。
    第1,概念不同。字符指针指向一字符,无结束标识;字符串以\0作为标识。
    第2,有许多针对字符串的函数,如strcpy,strcmp等,他们针对串进行操作。对字符指针无此概念。
    

#27


我也正被这个问题困扰。
#include<stdio.h>
void main()
{
  char *p,*q,*t,g[10],l[19];
  p="abcdf";
 t={'a','b','c'};
 g="abcd";
 l={'a','b','c'};
 gets(q);
}
呵呵,楼主能辨清里面的对与错吗?辨清了,对指针的理解也就差不多了。

#28


引用 10 楼 lfkoma 的回复:
引用 2 楼 mstlq 的回复:
请问哪本书上说char*是字符串指针的?

那应该怎么理解
char buf[10] = "csdn";
char*  a = buf;

为什么cout < < a < < endl;的时候不是数组的首地址 而是数组的全部内容?
如果要输出a的地址如何做?


cout < < &a[0] < < endl;

#29


汗 我觉得是指针呀~

#30


引用 27 楼 aifei521 的回复:
我也正被这个问题困扰。
#include <stdio.h>
void main()
{
  char *p,*q,*t,g[10],l[19];
  p="abcdf";
t={'a','b','c'};
g="abcd";
l={'a','b','c'};
gets(q);
}
呵呵,楼主能辨清里面的对与错吗?辨清了,对指针的理解也就差不多了。

这个例子对初始化与赋值的区别也做了很好的诠释

#31


字符串指针就是指向一串字符在内存的首地址。

#32


说的很有道理。

#33


受益匪浅

#1


字符,你知道吧?
字符串就是字符的集合,而字符串指针就是指向这些字符在内存的首地址。

#2


请问哪本书上说char*是字符串指针的?

#3


其实也可以理解成字符指针,现在的p就是指向第一个字符的,指针加1,就可以指向下一个字符.
字符串指针是相对于整个字符集合来说的.

#4



       #include <stdio.h>
       #include <stdlib.h>

       int
       main(void)
       {
       char c = 'a';
       char *p = &c;
       printf("%c\n",*p);
       return 0;
       }


这个是什么?

#5


int main()
{




char c='c';


char * p  = &c;



char str[] = "hello world" ;

cout << *p << endl;


p = str ;

cout << p << endl;



int j = 1;


p = (char*)&j;

cout << *p << endl;
return 1;



只是指向一个内存地址
看你怎么理解而已。


#6


你说的对,本质上讲,它是一个字符指针。

对于字符串来讲,它实际上是一个字符数组,数组的元素在内存上的储存位置是连续的,所以用字符数组的首地址就可以表示整个数组,C语言规定如果字符数组中有一个'\0',那这就是个字符串,所以char *可以表示一个字符串。
字符数组而并非字符串意义不大,字符串用的比较频繁。所以经常讲char *是一个字符串指针,当然 本质上它是一个字符指针

#7


char* 可以指向字符串的首地址

#8


对,可以理解。。。

比如:
char buffer[10];
其中,buffer是这一些列字符,整个字符串的首地址····

但是,其实,buffer只是指向了第一个,没有指向第二个,他们之间的关系你可以理解为:

几个兄弟,你知道老大的妻子,呵呵,根据妻子,得到老大,
哥几个站在一起,于是你知道了老三,老四的位置·~~

#9


学习了

#10


引用 2 楼 mstlq 的回复:
请问哪本书上说char*是字符串指针的?

那应该怎么理解
char buf[10] = "csdn";
char*   a = buf;

为什么cout << a << endl;的时候不是数组的首地址 而是数组的全部内容?
如果要输出a的地址如何做?

#11


指针想指什么都行。。不过编译器总唧唧歪歪

#12


其实叫字符串指针仅仅是习惯而已

#13


mark

#14


引用 10 楼 lfkoma 的回复:
引用 2 楼 mstlq 的回复:
请问哪本书上说char*是字符串指针的?

那应该怎么理解
char buf[10] = "csdn";
char*  a = buf;

为什么cout < < a < < endl;的时候不是数组的首地址 而是数组的全部内容?
如果要输出a的地址如何做?

用cout输出字符串的地址可以这样。 
char *p = "abc"; 
cout < < (void)*&p < < endl;
这是cout对象的特性啊,是cout对象故意写成这样的,不是错误。 

cout相比于c的printf,去掉了格式说明符,那么如何表示众多繁杂的格式呢,把cout设计得“智能”一点是一个可行的方案,至少iostream类的设计者是这样想的,cout的确比printf简单了不少。

#15


引用 3 楼 kouwenlong 的回复:
其实也可以理解成字符指针,现在的p就是指向第一个字符的,指针加1,就可以指向下一个字符.
字符串指针是相对于整个字符集合来说的.

没有什么字符串指针,只有字符指针,只是这个指针是指向字符串的首个字符的地址!

#16


引用 3 楼 kouwenlong 的回复:
其实也可以理解成字符指针,现在的p就是指向第一个字符的,指针加1,就可以指向下一个字符.
字符串指针是相对于整个字符集合来说的.

没有什么字符串指针,只有字符指针,只是这个指针是指向字符串的首个字符的地址!

#17


楼主这个问题问得好可爱

顶一个

#18


引用 10 楼 lfkoma 的回复:
引用 2 楼 mstlq 的回复:
 请问哪本书上说char*是字符串指针的?

 那应该怎么理解
 char buf[10] = "csdn";
 char*   a = buf;

 为什么cout  < < a  < < endl;的时候不是数组的首地址 而是数组的全部内容?
 如果要输出a的地址如何做?


这里对a 对行了隐式的类型转换。当cout发现形参是char * 型时,它净输出该地址所指向的字符串

#19


引用 10 楼 lfkoma 的回复:
 为什么cout  < < a  < < endl;的时候不是数组的首地址 而是数组的全部内容?
 如果要输出a的地址如何做?

operator overloading?

#20


就是字符指针啊,输出的时候看你用什么格式了
如果是%c,那么肯定是输出一个字符的
如果是%s,那么就输出直到碰到‘\0’才结束的

#21


引用 2 楼 mstlq 的回复:
请问哪本书上说char*是字符串指针的?

老谭
哪版我忘了
还是标题

#22


呵呵! 它其实就是一个指向地址的指针,就看你怎么看待了!

#23


字符指针和字符串指针其实是一个意思,当字符串只有一个字符时,指针就是它的地址;当有很多字符时,就是首地址。你看是不是一样了。

#24


引用楼主 lfkoma 的回复:
char* 为什么是字符串指针?
怎么不能理解成char* 为什么是字符指针?
好像没有看到字符指针这种说法 为什么?

常量指针,编译器在编译的时候,按照属性分别放在不同的区域

#25


是一连串常量地址空间的首地址···,
凡是试图写入那段内存··就会被报错···

#26


楼主:
    为何成为字符串指针,而不是字符指针。
    第1,概念不同。字符指针指向一字符,无结束标识;字符串以\0作为标识。
    第2,有许多针对字符串的函数,如strcpy,strcmp等,他们针对串进行操作。对字符指针无此概念。
    

#27


我也正被这个问题困扰。
#include<stdio.h>
void main()
{
  char *p,*q,*t,g[10],l[19];
  p="abcdf";
 t={'a','b','c'};
 g="abcd";
 l={'a','b','c'};
 gets(q);
}
呵呵,楼主能辨清里面的对与错吗?辨清了,对指针的理解也就差不多了。

#28


引用 10 楼 lfkoma 的回复:
引用 2 楼 mstlq 的回复:
请问哪本书上说char*是字符串指针的?

那应该怎么理解
char buf[10] = "csdn";
char*  a = buf;

为什么cout < < a < < endl;的时候不是数组的首地址 而是数组的全部内容?
如果要输出a的地址如何做?


cout < < &a[0] < < endl;

#29


汗 我觉得是指针呀~

#30


引用 27 楼 aifei521 的回复:
我也正被这个问题困扰。
#include <stdio.h>
void main()
{
  char *p,*q,*t,g[10],l[19];
  p="abcdf";
t={'a','b','c'};
g="abcd";
l={'a','b','c'};
gets(q);
}
呵呵,楼主能辨清里面的对与错吗?辨清了,对指针的理解也就差不多了。

这个例子对初始化与赋值的区别也做了很好的诠释

#31


字符串指针就是指向一串字符在内存的首地址。

#32


说的很有道理。

#33


受益匪浅