| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3086 人关注过本帖
标题:请教解答:char *str="hello" 与char str[]="hello" 二者的区别 ...
只看楼主 加入收藏
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
结帖率:100%
收藏
 问题点数:0 回复次数:15 
请教解答:char *str="hello" 与char str[]="hello" 二者的区别
附带几张自己觉得值得研究的图[local]1[/local][local]2[/local][local]3[/local]
搜索更多相关主题的帖子: hello 
2015-02-10 15:10
monitorsdio
Rank: 2
等 级:论坛游民
帖 子:7
专家分:12
注 册:2015-2-10
收藏
得分:0 
char *cstring = "hello";
char carray[] = "hello";
cstring == address of constant "hello"
*cstring == "hello"
carry == "hello"
差不多這樣
2015-02-10 18:10
邵蜜柚
Rank: 2
来 自:权大大
等 级:论坛游民
帖 子:79
专家分:86
注 册:2015-2-8
收藏
得分:0 
虽然都是字符串hello,但不一定在同一个存储空间里。

请给你男神一个爱你的理由。
2015-02-10 19:31
Liekkas
Rank: 1
等 级:新手上路
帖 子:12
专家分:3
注 册:2015-1-22
收藏
得分:0 
应该是前者只会存取字符串的第一个字符,后者存取整个字符串
2015-02-10 21:50
BuilderZ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:82
专家分:123
注 册:2014-9-22
收藏
得分:0 
在C语言和C++语言中,数组元素全为指针的数组称为指针数组。
一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。
例如,一个一维指针数组的定义:int *ptr_array[10]。
中文名指针数组
外文名pointer array
主要运用作为函数的参量
运用领域计算机编程
    源C语言和C++语言
    质“数组”
目录
1含义
2运用
3对比
▪ 与数组指针关系
▪ 与二维数组对比
4举例
1含义
编辑

指针数组中的每一个元素均为指针,即有诸形如“*ptr_array[i]”的指针。
指针数组中的元素亦可以表示为“*(*(ptr_array+i))”。又因为“()”的优先级较“*”高,且“*”是右结合的,因此可以写作**(ptr_array+i)。
由于数组元素均为指针,因此ptr_array[i]是指第i+1个元素的指针。
2运用
编辑

指针数组可以作为函数的参量使用,使用方式与普通数组类似。
指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。
3对比
编辑

与数组指针关系

数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动); 指针数组是数组元素为指针的数组,其本质为数组。
例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针 []的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
与二维数组对比

二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过制定下标对其元素进行修改。
指针数组:如char *str_B[5] 系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。

如果我做这样的定义:
char a[3][8]={"gain","much","strong"};
char *n[3]={"gain","much","strong"};
他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了
3×8的空间,而给n分配的空间则取决于具体字符串的长度。
此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
4举例
编辑

数组指针:
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
 
char c[][2] = {"哥", "哥", "我", "岸", "上", "走"};    //因为一个汉字占用两个字节
char (*p)[2];
int i;
void main()
{
    p=c;    //将指针定位于c[0]
    for(i=0;i<=5;i++)
    {
        printf("%s, ", *(p+i));  //或者将*(p+i)替换成*p++
    }
    printf("\n");   
    for(i=5;i>=0;i--)
    {
        printf("%s,",*(p+i));    //或者将*(p+i)替换成*p--
    }
}
指针数组:
int i;
  char *pch[6] = {"妹","妹","你","坐","船","头"};
  for(i=0;i<6;i++)
  {
printf("%s, ",*(pch+i));
  }
  printf("\n");
  for(i=5; i>=0; i--)
  {
  printf("%s\n",*(pch+i));
  }
Source From www.Baidu.com
再顺便一提, 楼上全部说错

[ 本帖最后由 BuilderZ 于 2015-2-11 03:05 编辑 ]
2015-02-10 23:49
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>

int main(void) {
    char str[] = "12345";
    char *pstr = "12345";
    printf("strlen(str) = %d\tsizeof(str) = %d\n", strlen(str), sizeof(str));
    printf("strlen(pstr) = %d\tsizeof(pstr) = %d\n", strlen(pstr), sizeof(pstr));

    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-02-11 11:11
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
回复 6楼 longwu9t
我好像懂了,这两种定义内存分配不同。

你醒了?快起来敲代码!!
2015-02-11 13:11
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
我正要对5楼的问题提出异议,5楼是拷贝的百度百科的,大家看这句话:
                           char c[][2] = {"哥", "哥", "我", "岸", "上", "走"};    //因为一个汉字占用两个字节

字符串末尾系统加上一个'\0',那么2是不是应该改为3呢??

你醒了?快起来敲代码!!
2015-02-11 13:13
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
回复 3楼 邵蜜柚
了解

你醒了?快起来敲代码!!
2015-02-11 13:14
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
回复 2楼 monitorsdio
如果是:str[]="hello",那么:str ,str[0] ,&str 这3者都是同一个值,这个值就是这个字符串数组的地址。
然而对于:char *str ="hello",str是一个字符指针变量,会另外占内存空间,与“hello”占的空间位置,大小都不同。
我最后这样理解的。

你醒了?快起来敲代码!!
2015-02-11 14:45
快速回复:请教解答:char *str="hello" 与char str[]="hello" 二者的区别 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058575 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved