嵌入式 Linux C语言(五)——指针与字符串

嵌入式 Linux C语言(五)——指针与字符串

一、字符串简介

1、字符串声明

声明字符串的方式有三种:字面量、字符数组、字符指针。

字符串字面量是用双引号引起来的字符序列,常用来进行初始化,位于字符串字面量池中,字符字面量是用单引号引起来的字符。

字符串字面量池是程序分配的一块内存区域,用来保存组成字符串的字符序列。多次用到一个字符串字面量时,字符串字面量池中通常只保存一份副本,一般来说字符串字面量分配在只读内存中,是不可变的,但是当把编译器有关字面量池的选项关闭时,字符串字面量可能生成多个副本,每个副本拥有自己的地址。

GCC编译器中字符串字面量是可以改变的,为了将字符串指针变量声明为常量可以用const修饰。

字符串是以ASCII字符NUL结尾的字符序列。字符串通常存储在数组或者从堆上分配的内存中。并非所有的字符数组都是字符串,字符数组可能没有NUL字符。

字符串的长度是字符串中除了NUL字符之外的字符数。

字符常量是单引号引起来的字符序列,通常由一个字符组成。字符的长度是1个字节,字符字面量的长度是4个字节。sizeof(char)= 1,sizeof(‘a’) =  4。

字符数组是一个数组,每个元素的值都可以改变。而字符串指针指向的是一个常量字符串,它被存放在程序的静态数据区,一旦定义就不能改变。这是最重要的区别。

2、字符串初始化

初始化字符串采用的方法取决于变量是被声明位字符数组还是字符指针,为字符串分配的内存要么是数组要么是指针指向的一块内存。

初始化字符数组:

char buffer[] = “hello world”;//字符串的长度为11,字面量需要12个字节

char buffer[12];

strcpy(buffer, “hello world”);

初始化字符指针:

char *buffer = (char *)malloc(strlen(“hello world”) + 1);

strcpy(buffer, “hello world”);

二、传递字符串

函数中经常将参数声明为字符指针。

1、传递简单字符串

直接传递字符串字面量:

char buffer[12];

strcpy(buffer, “hello world”);

传递字符数组:

char src[] = “hello world”;//字符串的长度为11,字面量需要12个字节

char dest[12];

strcpy(dest, src);

为了避免传入的字符串被修改,可以将传递的形参声明为const。

const char src[] = “hello world”;//字符串的长度为11,字面量需要12个字节

char dest[12];

strcpy(dest, src);//char *strcpy(char *dest, const char *src);

2、传递需要初始化的字符串

函数返回需要函数初始化的字符串,因此需要向函数传递缓冲区。

A、必须传递缓冲区的地址和长度

B、调用者负责释放缓冲区

C、函数通常返回缓冲区的指针

char pfun(char *buffer, int size)

{

xxxxx;

return buffer;

}

3、给应用程序传递参数

int main(int argc, char **argv)

{}

通过应用程序的入口函数main可以像应用程序传递参数

三、返回字符串

函数返回字符串时返回的实际是字符串的地址,返回的地址必须是合法的。

1、返回字面量的地址

Char *returnstring(int code)

{

xxx;

return “hello world”;

}

2、返回动态分配内存的地址

在函数内从堆上动态分配字符串的内存,返回地址。

char *blanks(int num)

{

char *buffer = (char *)malloc(num + 1);

strcpy(buffer, “hello world”);

xxx;

retrurn buffer;

}

使用完成后,函数调用者必须释放内存,否则会造成内存泄漏。

3、返回局部字符串的地址

返回局部字符串的地址是不可取的,局部字符串所在的内存会被其他栈帧覆盖。

char *blanks(void)

{

char buffer[] = "hello world";

return buffer;

}

时间: 2024-10-11 17:07:41

嵌入式 Linux C语言(五)——指针与字符串的相关文章

嵌入式linux C++语言(五)——友元

嵌入式linux C++语言(五)--友元 面向对象编程的类的设计机制实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,是类与外部的通信接口.在实践中,类外的某些函数需要频繁地访问类的数据成员,将类外的函数定义为类的友元函数.除了友元函数外,还有友元类,两者统称为友元.友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员. 友元可以是一个函数,该函数被称为友元函数. 一.

嵌入式 Linux C语言(九)——C语言的安全问题和指针陷阱

嵌入式 Linux C语言(九)--C语言的安全问题和指针陷阱 C语言是灵活度和自由度较大的编程语言,作为C语言核心的指针更是让C语言程序员可以越过安全的栅栏,对某些内存区域进行破坏性访问,引发安全风险.很多安全问题都能追根溯源到指针的误用.本文将从指针的角度解读C语言常见的安全问题和指针陷阱. 一.指针的声明和初始化 1.不恰当的指针声明 int* ptr1, ptr2;//声明ptr1为int指针,ptr2为整型 int *ptr1, *ptr2;//ptr1,ptr2都声明为指针 #def

嵌入式Linux C语言(二)——指针

嵌入式Linux C语言(二)--指针 指针是C语言中广泛使用的一种数据类型,是C语言的灵魂.指针提供了动态操控内存的机制,强化了对数据结构的支持,而且实现了访问硬件的功能.学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志. 一.指针的概念 在计算机中,所有的数据都是存放在内存中的,一般把内存中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不一样,如int占用4个字 节,char占用1个字节.为了正确地访问内存单元,必须为每个内存单元编上号.

嵌入式Linux C语言(三)——指针与函数

嵌入式Linux C语言(三)--指针与函数 指针对函数的功能有巨大的贡献,指针能够将数据传递给函数,并且允许函数对数据进行修改.指针对于函数的作用主要有两方面:将指针传递给函数和声明函数指针. 一.程序的栈和堆 程序的栈和堆是C语言程序运行的运行时元素. 1.程序栈 程序栈是支持函数执行的内存区域,通常和堆共享一块内存区域,通常程序栈占据内存区域的下部,堆用内存区域的上部.程序栈存放栈帧,栈帧存放函数参数和局部变量.调用函数时,函数的栈帧被推倒栈上,栈向上长出一个栈帧,当函数终止时,函数的栈帧

嵌入式Linux C语言(四)——指针与数组

嵌入式Linux C语言(四)--指针与数组 数组是C语言内建的数据结构,彻底理解数组及其用法是开发高效应用程序的基础.数组和指针紧密关联,但又不是完全可以互换. 一.数组简介 数组是能用索引访问的同种类型元素的连续集合.数组的元素在内存中是相邻的,中间不存在空隙,数组的元素是相同类型的. 1.数组的解读 数组的定义:int a[10] = {0,1,2,3,4,5}; a[0]:数组的第一个元素,首元素(做左值时表示第0个元素的内存空间) &a:数组的首地址,是常量,不能做左值,类型等同int

嵌入式 Linux C语言——C语言基础

嵌入式 Linux C语言--C语言基础 一.数据类型 1.基本数据类型 数据类型是创建变量的模型.变量名是连续存储空间的别名,程序中使用变量命名存储空间,通过变量可以使用存储空间.变量所占的内存大小取决于创建变量的数据类型. 2.有符号和无符号 有符号数中数据类型的最高位用于标识数据的符号,最高位为1表示为负数,最高位为0表示为正数. 计算机中有符号数通常使用补码表示,正数的补码为正数本身,负数的补码为负数的绝对值的各位取反后加1. 计算机中无符号数通常使用原码表示,无符号数默认为正数,没有符

嵌入式linux C++语言(四)——类与对象

嵌入式linux C++语言(四)--类与对象 类的设计和使用如下: #include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>using namespace std;class Stack{public:    Stack(int size=1024);    ~Stack();    void init();    bool isEmpty();    bool

嵌入式linux C++语言(二)——C++对C语言基础语法的扩展

嵌入式linux C++语言(二)--C++对C语言基础语法的扩展 C++是基于C语言扩展发展而来的面向对象的程序设计语言,本文将主要讨论C++语言基于C语言扩展的方面. 一.类型增强 1.类型检查更严格 在C语言中: const int a = 100; int *p = &a; 在C++语言中: const int a = 100;//必须在定义的时候初始化 const int *p = &a; 在C++语言中不能隐式转换数据类型. error: invalid conversion

嵌入式linux C++语言(六)——运算符重载

嵌入式linux C++语言(六)--运算符重载 运算符重载的本质是函数重载. 一.重载基础 1.运算符重载的语法 返值类型 operator 运算符名称(形参表列){    重载实体;} 2.友元重载 可以将运算符重载函数声明位友元函数 #include <iostream> using namespace std; class Complex { public:     Complex(float x=0, float y=0)         :_x(x),_y(y){}     voi