字符数组,字符指针,字符串常量,以及sizeof的一些总结

1、以字符串形式出现的,编译器都会为该字符串自动添加一个\0作为结尾

在代码中写"abc",编译器帮你存储的是"abc\0"

2、数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的,如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4]

字符串常量的类型可以理解为相应字符常量数组的类型,如"abc"的类型可以看成是const char[4]

3、字符数组和指针的区别

(1)把"abc"作为字符数组的初始值的时候,因为定义的是一个字符数组,所以相当于定义了一个空间来存放"abc",这时候的“abc\0”就不是常量,存放在栈上。

(2)把“abc”赋给一个字符指针变量时,如 char *ptr="abc";因为定义的是一个普通指针,并没有定义空间来存放"abc",这时候"abc"存放在程序的常量区,所以尽管ptr的类型不是const char*,并且ptr[0]=‘x‘;也能通过编译,但是执行ptr[0] = ‘x‘;就会发生运行时异常,因为这个语句试图去修改程序常量区中的东西。因此建议的写法是const char *ptr="abc",这样如果后面写ptr[0]=‘x‘,编译器就不会让它编译通过,也就避免了上面说的运行是异常了。

4、sizeof是用来求类型的字节数的

如int a;那么无论sizeof(int)或者是sizeof(a)都是等于4

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

如对于void func(char a[10],int ia[20],char *p)则a的类型是char*,ia的类型是int*,p的类型是char*

对字符数组使用sizeof:

(1)对于char str2[10] = "abcdef";   就有sizeof(str2) == 10,因为str2的类型是char[10]。---数组名在sizeof中不退化为指针,在strlen中退化为指针。

(2)对于void func(char a[10],int ia[20],char *p);--------   就有sizeof(a) == sizeof(ia) == sizeof(p) == 4,因为sa的类型是char*,ia的类型是int*,p的类型是char*。---数组名在作为函数参数时,退化为指针,函数只传数组的首地址,并不知道数组的大小,所以sizeof为4

注意sizeof(数组名)在(1)和(2)两种情况下的区别!

时间: 2024-10-30 23:25:05

字符数组,字符指针,字符串常量,以及sizeof的一些总结的相关文章

输入5个学生的名字(英文),使用冒泡排序按从大到小排序。 提示:涉及到字符串数组,一个字符串是一个一维字符数组;一个 字符串数组就是一个二维字符数组。

#include <stdio.h>#include <string.h> /*输入5个学生的名字(英文),使用冒泡排序按从大到小排序.提示:涉及到字符串数组,一个字符串是一个一维字符数组:一个字符串数组就是一个二维字符数组.*/ void main(){ char stuNames[5][100]; char tmp[100]; int i = 0,j = 0; for(i = 0; i < 5; i++) { printf("请输入第%d个学生的名字:"

字符串?字符数组?指针?傻傻分不清楚

首先我们来看一下下面这个程序,不妨先猜猜它会输出什么哟. #include<stdio.h> #include<string.h> int main(void) { int a[5] = {1,2,3,4,5}; int i = 1; char str1[] = "HelloWorld\n";//数组除了在被运算符sizeof操作的时候不是直接看作地址外,其余都是可以直接等同于这个数组首元素的地址的.即一个指向首元素的指针 char *str2 = "

C: 当字符数组首指针转化成char *指针,sizeof(*ptr)不为array的size

#include <stdio.h> #include <string.h> int main() { char a[10] = "\0"; char *pa = (char *)&a; char (*paa)[10] = &a; printf("-----a[10]----\n"); printf("a size:%d, pa size;%d, *pa size:%d, *paa size:%d\n",

GDB调试字符数组时指针和数组区别的体现

测试ftell函数时发现报错,先贴源码 // File Name: ftell.c #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { FILE* fp = fopen("myfile.in", "r"); if (fp == NULL) { perror("fopen error"); exit(1); } char buf[4

c语言字符数组和指针的经典用法

1.字符数组 许多情况下,对字符串的处理使用字符数组会更加方便,比如: 我觉得不改变字符串的原有顺序,对字符串进行删除等操作时,使用字符数组效果会更好. eg:给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个.例如:"   i    am a      little boy.    ",变成"i am a little boy",语言不限,但不要用伪代码作答. answer: #inclu

Java学习之IO流(其他操作流 【操作基本数据类型、操作字节数组、操作字符数组、操作字符串】)

操作基本数据类型DataInputStream.DataOutputStream 1 DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt")); 2 dos.writeUTF("你好"); 3 dos.close(); 4 5 DataInputStream dis = new DataInputStream(new FileInputStream("data

C与C++中的字符数组char*和字符串string的相互转化

1. 将字符数组char[]转化为字符串string char ch [] = "ABCDEFG"; string str(ch);//也可string str = ch; //或者 char ch [] = "ABCDEFG"; string str; str = ch;//在原有基础上添加可以用str += ch; 2. 将字符串string转化为字符数组char[] char buf[10]; string str("ABCDEFG");

字符数组(判断字符串大小)

//从键盘读入两个字符串,比较字符串的大小 //思路:1>字符串长的  大于  字符串短的 //       2>当两个字符串长度相同时从第一位开始比较直到判断出大小 //       3>如果没有判断出大小那么字符串相等  char ch1[100] ;  char ch2[100] ;  printf("请输入第一个字符串:\n");  gets_s(ch1);  printf("请输入第二个字符串:\n");  gets_s(ch2);  i

JavaSE8基础 String String.valueOf 将字符数组转成字符串

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku.t01; public class Demo03 { public static void main(String[] args) { char[] c = { '给', '最', '苦' }; String str = String.valueOf(c); System.

用字符数组存放一个字符串

1 #include <iostream> 2 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 4 using namespace std; 5 int main(int argc, char** argv) { 6 char str[]="I love CHINA!"; 7 cout <&l