c19---指针和字符串

//
//  main.c
//  指针和字符串
//
//  Created by xiaomage on 15/6/14.
//  Copyright (c) 2015年 xiaomage. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // 保存字符串
    char str[] = "lnj";//字符串 这个字符数组名 也是char*类型,
    printf("str = %s\n", str);
    str[0] = ‘m‘;
    printf("str = %s\n", str);

    // 因为数组名就是数组的地址, 数组名保存的就是数组的第0个元素的地址,所以我们可以使用指针来保存字符串

    // 通过指针保存一个字符串, 其实就是保存的字符串第0个元素的地址
    char *str2 = "lmj";
    printf("str2 = %s\n", str2);
    str2[0] = ‘m‘;  //字符串中的某一个字符 不能修改
    printf("str2 = %s\n", str2);

    /* 通过数组保存字符串和通过指针保存字符串的区别:
     1.如果通过数组来保存字符串, 那么字符串是一个变量 str  可以修改
     如果通过指针来保存字符串, 那么字符串是一个常量 str2 不能修该,
     2.数组保存的字符串存储在内存的栈中, 而通过指针保存的字符串存储在常量区
     存储在栈中的变量有一个特点, 当作用域结束系统会 自动释放该变量
     存储在常量区中的值有一个特点, 不会被释放, 而且 多个相同的值对应的地址相同*/

    char str3[] = "lnj";
    printf("str = %p\n", str);
    printf("str3 = %p\n", str3);//地址不一样

    char *str4 = "lmj";
    printf("str2 = %p\n", str2);
    printf("str4 = %p\n", str4);//地址一样

    // 利用指针保存字符串的应用场景
    for (int i = 0; i < 100; i++) {
        // 意味着会开辟100块存储空间来保存xmg这个字符串,并且会释放100次,性能问题,
        char str5[] = "xmg";
        char *str6 = "xmg";
        printf("str5 = %s\n", str6);
    }

    /*
     保存字符串的两种方式:
     char str[] = "lnj";
     存储的位置: 栈
     特点: 相同的字符串会重复的分配存储空间
           字符串中的字符可以修改

     char *str = "lnj"
     存储的位置: 常量区
     特点: 相同的字符串不会重复的分配存储空间
            字符串不可以修改
     */

    return 0;
}
//
//  main.c
//  指针和字符串注意点
//

#include <stdio.h>

int main(int argc, const char * argv[]) {

    // 指针没有被初始化不能随便使用, 野指针
    int *p;
    printf("*p = %i\n", *p); //报错

    char str[10];
    scanf("%s", str);//可以存进去
    printf("str = %s\n", str);

    // 1.指针没有初始化, 野指针,没有指向任何地址,没法存,
    char *str;
    scanf("%s", str);    //报错
    printf("str = %s\n", str);

    // 注意: 用指针来保存字符串不可以被修改
    // 指针没有初始化不能随便使用
    return 0;
}
//
//  main.c
//  指针数组,字符串数组
//

#include <stdio.h>

int main(int argc, const char * argv[]) {

    char str1[] = "lnj";
    char str2[] = "lmj";
    char str3[] = "jjj";
    char str4[] = "lk";

    char strs[4][20] =
    {    //字符串数组是二维数组
        "lnj",
        "lmj",
        "jjj",
        "lk"
    };

    char *str1 = "lnj";  //char []  ===  char *  ===  " ... "
    char *str2 = "lmj";
    char *str3 = "jjj";
    char *str4 = "lk";

    // 定义数组的格式: 元素类型 数组名称[元素的个数]
    int  a = 10;
    int  b = 20;
    int nums[2] = {10 , 20};

    char* names[4] =     //每一个元素是char*也就是char[],也可以是字符串,
    {
        "lnj",
        "lmj",
        "jjj",
        "lk"
    };

    for (int i = 0; i < 4; i++) {
        printf("names[%i] = %s\n", i , names[i]);
    }

    return 0;
}
//
//  main.c
//  指针类型的特点
//
//  数组名即是xx[]也是xx*类型,字符串名即是char[]类型也是char*类型
//    xx[]和xx*是数组类型的两种形式,
//

#include <stdio.h>
void change();
void change2();
void change3(int values[]);
void change4(int *p);
char *demo();
char *demo2();

int main(int argc, const char * argv[]) {
    /*
     只要是数据类型就具备3个特点
     1.可以用来定义变量
     2.可以用来作为形参的类型
     3.作为返回值
     */

    int num = 10;
    change(num);
    printf("num = %i\n", num);

    char *name = "lnj";//指针指向字符串是一个常量,字符串的字符不能更改,
    change2(name);

    int nums[] = {1, 3, 5}; // int[] === int*, nums是int[]类型也是int*类型,
    change3(nums); // 数组名就是数组的地址,998
    change4(nums); // 数组名就是数组第0个元素的地址,998
    printf("nums[0] = %i\n", nums[0]);

    char *name = demo();//name指向常量区"lnj"所在的区域
    printf("name = %s\n", name);

    char *name2 = demo2();
    printf("name2 = %s\n", name2);

    return 0;
}

char *demo2() //name和"lnj"都在函数所在的栈区域,"lnj"占4个字节,函数执行结束后销毁,
{
    char name[]= "lnj";
    return name;
}

char *demo() //demo函数会在栈中开辟存储区域,name在函数所在的区域内,"lnj"不在函数所在的内存区域而是在常量区,
{
    char *name = "lnj";//字符串名即是char*类型也是char[]类型,
    return name;
}

void change4(int *p)
// int *p = nums; == int *p = &nums; == int *p = &nums[0]
// int *p; p = nums;  p == nums;
{
    p[0] = 998;
}
// 不专业
void change3(int values[])
{
    values[0] = 998;
}

void change2(char *p)
{
    *p = "lmj";//不能更改
}

void change(int value)
{
    value = 55;
}
//
//  main.c
//  指针练习
//
//  Created by xiaomage on 15/6/14.
//  Copyright (c) 2015年 xiaomage. All rights reserved.
//

#include <stdio.h>
#include <string.h>
int myStrlen(char *str);
int myStrlen2(char *str);
int myStrlen3(char *str);

int main(int argc, const char * argv[]) {
    // 要求自己实现strlen函数
    char *name = "lnj";
    size_t size = strlen(name);
    int size =myStrlen3(name);
    printf("size = %i\n", size);
    return 0;
}

int myStrlen3(char *str)   //str[i],*str++,数组名和指针名的使用是一样的,xx[]和xx*是数组类型的两种形式,
{
    int count = 0;
    // \0 ascii 0 // 0代表假 1真
    while (*str++) count++;

    return count;
}

int myStrlen2(char *str)
{
    int count = 0;
    //    *str == str[0]
    while (*str++ != ‘\0‘) {
        count++; // 1
//        str = str + 1; // str == str[1]
//        str++; // ++可以在变量名前, 也可以在变量名后
    }
    return count;
}

int myStrlen(char *str)
{
    int count = 0;
    while (str[count] != ‘\0‘) {
        count++;
    }
    return count;
}
时间: 2024-10-08 21:53:21

c19---指针和字符串的相关文章

指针,数组,字符串

指针和数组的区别     指针和数组都可以通过下标的方法和指针发(p+i)来访问数组元素     1.指针  可以修改指向     数组名 是常量,表示首元素的地址,不能改变     2.指针存贮空间:4/8个字节     数组的存储空间:元素个数 * 空间存储空间 定义字符串两种方式:     1.使用数组定义字符串 ---->    字符串变量  字符串可以被改变     2.使用指针定义字符串 ---->    字符串常量  字符串元素不可改变 指针作为函数参数进行传递,可以实现形参的改

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

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

地址/指针和字符串

今天做作业时,发现下列一个问题. 首页是这个自编的strncpy函数: #include "ctype.h" #include "stdlib.h" #include "string.h" #include "windows.h" int main() { char *strata(char s1[],char s2[],int n); char nam1[41]="das"; char nam2[41]=

指针 指针与数组 指针与字符串 指针与函数 结构体与指针 宏

指针 指针与数组 指针与字符串 指针与函数?? 指针与数组 1.数组名:数组元素首地址 eg: int array[3]={1,3,6}; 这里array 恒等于&array[0] 2.int *p = a; int *p = 0; int a[]={0}; 3.int *p = a; 均指向数组的首地址 *p是? *(p+1)是?(*p)+1是? *(p+1)决定向下移动几个字节是类型 4.指针可以当数组名使用 p[1] = 3; 恒等于a[1] ;恒等于*(p+1);恒等于*(a+1) 5.

浅谈运用指针引用字符串

一.字符串的引用方式 1.如果字符串存放在字符数组中可以用数组名和下标引用 char string[10] = "Hello word"; printf("%s",string); 2.用字符指针变量指向字符串常量,用字符指针引用字符串 char *strp = "Hello word"; printf("%s",strp); //系统将字符串常量以字符数组形式保存在内存中,字符串末尾系统自动加了一个'\0'.再将字符数组的首

用指针对字符串输入/输出

#include<iostream> using namespace std; int main(void) { char *s=new char[80]; cout<<"输入一个字符串: "; cin>>s; getchar(); cout<<"输入的字符串是:"; cout<<s; getchar(); delete []s; s=NULL; } s是一个字符型指针变量,通过new运算符申请一个动态数组

关于DELPHI数组,指针,字符串转换的例子!(转)

var   aa:   array [0..5] of Char;   bb:Pointer;   cc:string;   dd:PChar; procedure TForm1.Button1Click(Sender: TObject);begin dd:='abcdef'; //以下是pchar内容转数组FillChar(aa,length(dd),#0);Move(dd^,aa,SizeOf(aa)); //以下是数组传递到指针bb:=GetMemory(SizeOf(aa));Move(

DELPHI数组,指针,字符串转换的例子

关于数组,指针,字符串转换的例子 var   aa:   array [0..5] of Char;   bb:Pointer;   cc:string;   dd:PChar; procedure TForm1.Button1Click(Sender: TObject);begindd:='abcdef'; //以下是pchar内容转数组FillChar(aa,length(dd),#0);Move(dd^,aa,SizeOf(aa)); //以下是数组传递到指针bb:=GetMemory(S

第10章 菜单及其它资源_10.1 图标、鼠标指针、字符串等资源

10.1 图标.鼠标指针.字符串和自定义资源 10.1.1 向程序添加图标 (1)加载图标:(注意:第1个参数为hInstance,不能为NULL表示从程序本身加载) 图标ID为数字 ①wndclass.hIcon = LoadIcon(hInstance,MAXINTRESOURCE(IDI_ICON); ②wndclass.hIcon = LoadIcon(hInstance,MAXINTRESOURCE(125) 图标ID为字符串 ①wndclass.hIcon = LoadIcon(hI

C语言:通过指针对字符串进行拼接

// //  main.c //  Pointer_stringcat // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:使用指针连接字符串,并将连接后的字符串输出到屏幕上. #include <stdio.h> #include<string.h> void Pointer_stringcat(char *str1,const char *str