1. Trang chủ
  2. » Công Nghệ Thông Tin

8 3 con trỏ và mảng kí tự lập trình C++ daynhauhoc.com

4 227 2
Tài liệu được quét OCR, nội dung có thể không chính xác

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 4
Dung lượng 1,11 MB

Nội dung

Trong bài học này, chúng ta sẽ cùng nhau tìm hiểu một số điểm cần lưu ý khi sử dụng con trỏ trỏ đến mảng kí tự C-style string.. C-style string symbolic constants C-style string là một t

Trang 1

8.3 Con tro va mang ki tự

Thursday, September 21, 2017 7:31 PM

Được cắt từ: https://cpp.daynhauhoc.com/8/3-con-tr-va-mang-ki-tu/ Rất vui khi nhận được sự quan tâm theo dõi của các bạn trong khóa học lập trình trực tuyến ngôn ngữ C++

Trong bài học này, chúng ta sẽ cùng nhau tìm hiểu một số điểm cần lưu ý

khi sử dụng con trỏ trỏ đến mảng kí tự (C-style string)

C-style string symbolic constants

C-style string là một trường hợp đặc biệt của mảng một chiêu, được ngôn

ngữ C++ hổ trợ một số đặc điểm nhằm giúp lập trình viên thao tác với C-

style string một cách thuận tiện hơn

Ngoài cách khởi tạo mảng một chiều thông thường, C-style string còn có

thể khởi tạo bằng một hằng chuỗi kí tự như sau:

char my_name[] = “Le Tran Dat";

Chuỗi kí tự "Le Tran Dat" được xem như là một chuỗi hằng kí tự, nó có dia chỉ cụ thể trên bộ nhớ ảo, nó được lưu trên bộ nhớ ảo, nhưng không có tên biến để truy xuất đến địa chỉ của chuỗi hằng kí tự này Nhưng sau khi

sử dụng chuỗi hằng kí tự "Le Tran Dat" để khởi tạo cho mảng my_name, mảng my_name không được khai báo là kiểu chuỗi hằng kí tự (const char

[]) nên các kí tự trong mảng my_name hoàn toàn có thể bị thay đổi

Ví dụ:

char my_name[] = “Le Tran Dat";

my name[1] = 'E'; //=> "LE Tran Dat"

Điều này chứng tỏ mảng my_name được cấp phat bộ nhớ tại địa chỉ khác chuỗi hằng kí tự "Le Tran Dat", việc khởi tạo mảng kí tự bằng một chuỗi hằng kí tự chỉ đơn giản là copy từng kí tự của chuỗi "Le Tran Dat" và đưa vào mảng

Do đó, con trỏ kiểu char (char *) trỏ đến mảng my_name va trỏ đến vùng nhớ của chuỗi hằng kí tự "Le Tran Dat" là 2 trường hợp khác nhau

Mình lấy ví dụ một con trỏ kiểu char (char *) trỏ đến mảng my_name:

char my_name[] = “Le Tran Dat";

char *p_ name = my_ name;

p name[1] = 'E';

cout << my_name << endl;

Két qua in ra man hinh la:

LE Tran Dat

Trang 2

Như vậy, con trỏ p_name sau khi trỏ đến mảng my_name thì có thể thay đổi giá trị bên trong vùng nhớ mà mảng my_name đang nắm giữ, vì vùng nhớ này không phải là vùng nhớ hằng

Trường hợp tiếp theo, mình sẽ cho một con trỏ kiểu char (char *) trỏ trực

tiếp đến chuỗi hằng kí tự:

char *p name = “Le Tran Dat";

p name[1] = 'E';

cout << p_name << endl;

Khi nhấn F5 để Debug đoạn chương trình này, Visual studio 2015 đưa ra thông báo xảy ra xung đột vùng nhớ

Microsoft Visual Studio

Exception thrown at 0x00FE22FÔ in C++ Tutorial.exe: 0xC0000005: Access violation

writing location 0x00FESCC9

if there is a handler for this exception, the program may be safely continued

Break when this exception type is thrown

Break and open Exception Settings

Break Continue Ignore

Nguyên nhân là do vùng nhớ lưu trữ chuỗi kí tự "Le Tran Dat" là vùng nhớ

hằng, giá trị bên trong vùng nhớ này không thể thay đổi, trong khi đó lệnh p_name[1] = 'E'; cố gắng thay đổi giá trị bên trong vùng nhớ hằng

Đến đây có thể có một số bạn thắc mắc về địa chỉ của chuỗi hằng kí tự

"Le Tran Dat" mà mình sử dụng Mặc dù chuỗi hằng kí tự không được khai báo như một biến thông thường, nhưng nó được tạo ra và có địa chỉ cụ

thể trên vùng nhớ ảo Chúng ta truy xuất địa chỉ của chuỗi hằng kí tự

bằng chính nội dung của chuỗi đó:

int main()

{

cout << &("Le Tran Dat") << endl;

cout << &("LE TRAN DAT") << endl;

system( "pause" );

return 0;

}

Kết quả của đoạn chương trình này trên máy tính của mình là:

o0EFSCCS

o0EFSB30

Trang 3

Như vậy, mỗi chuỗi hằng kí tự có nội dung khác nhau sẽ có một địa chỉ khác nhau Chúng ta có thể sử dụng nội dung của chuỗi hằng kí tự này

như mảng một chiều, nhưng không thể thay đổi nội dung của nó

for (int i = @; i < strlen("Le Tran Dat"); i++)

{

}

cout << endl;

cout << "Le Tran Dat"[i];

"Le Tran Dat"[1] = 'E'; //this line will make an error

std::cout and char pointers

Với các mảng một chiều có kiểu dữ liệu khác, để xem được nội dung bên

trong mảng, chúng ta cần sử dụng vòng lặp để duyệt từng phần tử bên trong mang Vi du:

float arr[] = { 2.5, 1.6, 0.2, 3.14 };

int size = sizeof(arr) / sizeof(arr[@]);

for (int i = 0; i < size; i++)

{

}

Đối với mảng kí tự (C-style string) chúng ta có thể in toàn bộ nội dung của mảng bằng cách sử dụng đối tượng cout như sau:

cout << arr[i] << h

char str[] = "This is an example string";

cout << str << endl;

Đối với các kiểu dữ liệu không phải kiểu con trỏ char (char *), đối tượng cout chỉ in ra địa chỉ của mảng (vì arr tương đương với &arr), nhưng với kiểu con trỏ char (char *), đối tượng cout có cách định nghĩa khác

Thực ra đối tượng cout chỉ hổ trợ cho kiểu con trỏ char (char *), nhưng vì

sử dụng tên mảng str tương đương với &str Như các bạn biết, toán tử address-of trả về kiểu con trỏ, nên str truyền vào đối tượng cout được

xem la con tro kiéu char (char *)

char str[] = "Hello!";

char *p_ str = str;

cout << str << endl;

cout << p_ str << endl;

Do đó, đoạn chương trình này in ra 2 dòng có nội dung giống nhau

Điều này dẫn để một hệ quả, chúng ta không thé in ra địa chỉ của một

biến kiểu kí tự (char)

char ch = 'A';

cout << &ch << endl;

Trang 4

Trên máy tính của mình, kết quả cho ra màn hình là:

8ˆ C;\UsersvADMIN\Xdocuments\visual studio 2015\Projects\C++ Tutorial\Debug\C++ Tutorial.exe

VÌ &ch trả về dữ liệu kiểu (char *) nên đối tượng cout xem nó như là C- style string nên in ra kí tự A và tiếp tục cho đến khi gặp giá trị 0'

Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập

trình C++ hướng thực hành

Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn

đàn

www.daynhauhoc.com

Link Videos khóa học

https://www.udemy.com/c-co-ban-danh-cho-nquoi-moi-hoc-lap-

trinh/learn/v4/overview

Ngày đăng: 25/10/2017, 20:35

TỪ KHÓA LIÊN QUAN

w