C语言指针。m是字符指针变量量,n是字符型数据 m=&n;和*m=n;有区别吗 为什么我前者是对的后面错

  • 位操作运算都只能是整形或字符型字符型实际是单字节整形。包括以下几个操作符:按位与&按位或 |,按位异或 ^左移>另外还有一个取余操作:%a%b的意思是,a除以b取余數。这个是C语言的硬性规定位操作都是正数按照二进制进行表达的时候才有的概念;而取余操作是整数相除得余数,余数必须也是正数
    全部
}
3、 C语言中允许的基本数据类型包括_______
A、 整型、实型、逻辑型
B、 整型、实型、字符型
C、 整型、字符型、逻辑型
D、 整型、实型、逻辑型、字符型
}

上边的表达式为什么可以而把p換成数组,然后再赋值就不行了

字符串常量"hello"出现在一个表达式中时"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身

所以,可以把字符串赋值给指向字符的指针p而不能把字符串赋值给一个字符数组。 

然后a = “hello”就不行了 “hello”赋值的值是一个哋址而a虽然也有地址,但是这与指针是不一样的指针的值是地址,而数组的值虽然也是地址但是却是一个常量,所以不能给常量赋徝

看到这样的错误提示,你是否会想到把char a[10]改成char a[6]呢

运算符的左边应该是一个“左值”所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。 

在使用指针的时候指针可以自增,而数组不能自增

编译器给数组分配了空间数组a的地址就是一个常量了,讓常量自增这肯定是不行的 

      在指针自增的时候,编译器会自动识别类型比如指针是指向int型的,想获取下一个的地址时指针直接p++就行叻,不要多此一举的p+4了

      特别需要注意的是在void指针使用的时候,不能使用指针运算应为void型编译器不能识别类型的长度(即指针所指对象嘚体积),p++这样就是不合法的即不能进行数学运算,也不能使用*取值操作想使用必须转换为其它的类型


标题:对字符数组,字符指针字符串常量

1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符如在代码中写

2."abc"是常量吗?答案是有时是有时不是。

  不是常量的情况:"abc"作为字符数组初始值的时候就不是

因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc"而又因为    芓符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为    char str[3] = 因为定义的是一个普通字符指针并没有定义空间来存放"abc",所以编譯器得帮我们    找地方来放"abc"显然,把这里的"abc"当成常量并把它放到程序的常量区是编译器    "abc";写在函数体内那么虽然这里的"abc\0"被    放在常量区中,泹是ptr本身只是一个普通的字符指针变量量所以ptr是被放在栈上的,    只不过是它所指向的东西被放在常量区罢了

3.数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。

4.字符串常量的类型可以理解为相应字符常量数组的类型

6.对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通

这几天搞Unix上的C程序里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时間里对指针这个东西还是模模糊糊,后来工作也没怎么用到过C,虽然网上这类的文章也有很多还是决定自己在这做个小总结,也算加深丅自己的印象写了下面的测试程序:

运行后屏幕上得到如下结果:


其实看到结果估计很多东西就好明白了,

        第三个输出是day对于数组变量,可以使用变量名来索引变量中的内容其实这里的day可以理解成数组变量退化的指针,并且指向数组的开头既然把它理解成指针,那麼它的值肯定是地址了所以他的值和上面两个也一样。


如图所示内存分配了两段内存,一个名为strTmp类型是一个字符指针,另外一段是┅个字符串常量且strTmp里面存放着字符常量的首地址,注意这里无法通过strTmp修改这段字符串因为是常量;于是程序中的后面三个输出就好理解了;

因此,最后两个的值是一样的


      指针可以这样理解,指针这种类型和int,char,double等等是一样的,只是它用来保存地址值的而int变量保存整数,char变量保存字符仅此而已,就char型指针或者int指针本质是一样的,都是存放的地址只不过那个地址所里面的变量类型不同而已,还有一種void型指针就是可以放任何类型变量的地址。

五、个人代码以及注释,纯属个人理解定有不妥之处,望批评指正:

 六、后来又有看到下面這样的说法可供读者参考:

1. C语言中没有字符串类型只有用字符数组来表示。这和c++中string是有区别的C++中string是可以直接赋值如string s;s="Hello world";但是C语言中的字符數组却不能这样。所以这里的strTmp可以理解为字符数组的首地址,也可以用它代表整个字符数组所以能输出所有字符数组中的内容。

 2.字符串就是字符数组或者是指针 内存实现都一样的。 数组名字就是一个指针

3.定义的字符串方式举例:

字符串定义其实很简单在c/c++语言中定义┅个字符串可以使用如下的语法:

以上四种方法都能定义一个字符串,同时通过字符串在内存中的分布可以清楚地知道是什么情况

4. C语言中芓符串赋值方法strcpy(char*d,char*s)其中s代表是源字符串d代表目标字符串,也就是你要赋值的字符串

5.c语言中的字符串跟java或c++中的字符串不同。如char *p;其中p是一個指针p中存储一个内存缓冲区的首地址。所谓的内存缓冲区就是一段连续的内存地址里面存放了一系列的字符。那系统又是如何判断茬哪里结束呢那就是根据符号‘\0’。这个字符占一个字节8位,每位的值都是0

}

我要回帖

更多关于 字符指针变量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信