字符串比较、字符指针和字符串的存储位置

字符指针==的意义:判断两个指针是否指向同一地址

字符指针存在栈里,字符串存在字符数组里(静态数组在栈里)或者在字符常量区,字符常量区没有重复的字符串

int main()
{
    char *s1 = "abc";//s1在栈上,"abc"在字符常量区,s3也指向这个"abc"
    char *s3 = "abc";
    char s2[] = "abc";//"abc"在栈上
    char *s4 = new char[10];
    char *s5 = static_cast<char*>(malloc(10));
    cout << &(s2[0]) << endl;//以下四条语句都是输出abc
    cout << &s1[0] << endl;
    cout << &s3[0] << endl;
    cout << s1 << endl;
    cout << strcmp(s1, s2) << endl;
    cout << (s1 == s2) << endl;//判断是否指向同一地址
    cout << (s1 == "abc") << endl;
    cout << (s2 == "abc") << endl;
    printf("%p,%p,%p", s1, s2, s3);
}

memcpy拷贝字符串,第三个参数需要自己控制,strcpy不需要,只需要两个指针就行;下面的代码问题在哪儿?

 1 void AddStr(char *pBuffer, char*pStrSrc1, char*pStrSrc2)
 2 {
 3     memcpy(pBuffer, pStrSrc1, strlen(pStrSrc1));
 4     memcpy(pBuffer + strlen(pStrSrc1), pStrSrc2, strlen(pStrSrc2));//没有复制pStrSrc2结尾的空字符到pBuffer
 5     //memcpy(pBuffer + strlen(pStrSrc1), pStrSrc2, strlen(pStrSrc2)+1);
 6     *(pBuffer + strlen(pStrSrc1) + strlen(pStrSrc2)) = ‘\0‘;
 7 }
 8 void TestFunc()
 9 {
10     char ayBuffer[256];
11     char* pStrSrc1 = "our site is ";
12     char* pStrSrc2 = "10jqka.com.cn";
13     AddStr(ayBuffer, pStrSrc1, pStrSrc2);
14     printf(ayBuffer);
15
16 }

AddStr用strcpy来实现,strcpy会自动在结尾加上空字符,strcpy比mencpy多了一个空字符处理时间,只调用了一次strlen,两者都遍历了两个字符串各一次

1 void AddStr(char *pBuffer, char*pStrSrc1, char*pStrSrc2)
2 {
3
4     strcpy(pBuffer, pStrSrc1);
5     strcpy(pBuffer + strlen(pStrSrc1), pStrSrc2);//从上次空字符处开始覆盖
6 }
时间: 2024-10-12 04:49:29

字符串比较、字符指针和字符串的存储位置的相关文章

java统计字符串中字符及子字符串个数

import java.util.Scanner;public class Counter { static Scanner scanner = new Scanner(System.in); public static void count(String s) { int low, upper, num, others; low = upper = num = others = 0; for (int i = 0; i < s.length(); i++) { if (Character.is

字符数组,字符指针,字符串常量,以及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)把&qu

字符指针与字符串

void getmemory(char p){p=(char ) malloc(100);strcpy(p,"hello world");}int main( ){char *str=NULL;getmemory(str);printf("%s/n",str);free(str);return 0;}会出现什么问题?[标准答案]程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险. 参考网上的代码:void getmemo

c与c++中输出字符指针和字符串指针的问题

首先搞清楚在c语言中没有字符串的类型,所以对字符串操作,有两种形式:可以用字符指针,或者字符串数组(这里的指针变量c,系统会为其重新分配内存. c程序示例: 1  #include <stdio.h>  2   3 int main()  4 {  5   char *a="hello";  6   char b[]={'l','i','n','u','x'};  7   char *c=&b[1];  8   9    printf("%c\n"

字符串函数(strcpy字符串拷,strcmp字符串比较,strstr字符串查找,strDelChar字符串删除字符,strrev字符串反序,memmove拷贝内存块,strlen字符串长度)

1.strcpy字符串拷贝拷贝pStrSource到pStrDest,并返回pStrDest地址(源和目标位置重叠情况除外) char *strcpy(char *pStrDest, const char *pStrSource) { assert(NULL!=pStrDest && NULL!=pStrSource); char *strTemp=pStrDest; while ((*pStrDest++ = *pStrSource++) != '\0'); return strTemp

字符指针,字符数组,双引号的字符串的区别与联系

作者 :  陈宗权 先说说双引号的字符串,比如"chenzongquan",它是由里面咱们看到的一系列字符以及一个尾随的'\0'字符组成,存储在内存的只读存储区中.只读存储区是在整个程序运行期间都保留着的.可见的,而且其中的数据原则上是保持不变的.所以对一个双引号表示的字符串,只要你知道它的具体地址,可以在程序的任何一个函数中再次使用. 说到只读,要引一下,在16位系统中没有进行内存访问保护,所以在程序运行时实际上也可以改变只读存储区中的数据,但是在32位系统中有内存访问保护,程序运行

C语言中,为什么字符串可以赋值给字符指针变量

转载于:http://www.cnblogs.com/KingOfFreedom/archive/2012/12/07/2807223.html 本文是通过几篇转帖的文章整理而成的,内容稍有修改: 一. char *p,a='5';p=&a;                     //显然是正确的,p="abcd";              //但为什么也可以这样赋值?? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点! 答: 双引号做了3件事:  1.

字符型指针与字符串常量

字符串常量在编译时系统给定存储位置,可以赋值给字符指针:此时可以通过下标进行访问,但不可以通过下标修改字符串的值. 字符指针指向字符数组时可以修改字符串的值. #include <stdio.h> #include <string.h> int main() { char a[26]; char *b = "abc"; //定义时初始化 b="123"; //可以被重新赋值 //b[1] = 'v'; //不可以被修改 a[1] = b[1]

深入理解C指针之五:指针和字符串

基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中.不过,并非所有的字符数组都是字符串.例如,字符数组可能没有NUL字符. C中有两种类型的字符串. * 单字节字符串.由char数据类型组成的序列. * 宽字符串.由wchar_t数据类型组成的序列. wchar_t数据类型用来表示宽字符串,可能是16位或32位宽.这两种字符串都以NUL结尾.宽字符主要用来