2012-03-12 62 views
5

Trong C++, tôi có một mảng char định nghĩa là:C++, Làm một con trỏ đến một mảng char

char miniAlphabet[] = {'A','B','C','D','E', '\0'}; 

Tôi muốn thay đổi các giá trị của mảng này từ chức năng khác mà không đi qua nó để các chức năng. Đây là nơi bạn sử dụng con trỏ phải không?

Vì vậy, câu hỏi của tôi là cách chính xác để tạo con trỏ tới mảng char này là gì. Tôi chỉ cần tạo một con trỏ đến phần tử đầu tiên và sau đó khi tôi muốn sửa đổi các giá trị tôi bước qua bộ nhớ cho đến khi tôi nhấn ký tự kết thúc?

+0

Chỉ cần nhìn này, có tốt hơn rất nhiều so với \ 0.Cảm ơn –

Trả lời

14
char miniAlphabet[] = {'A','B','C','D','E', '\0'}; 

Chúng tương đương nhau.

char *p1 = miniAlphabet; 

char *p2 = &(miniAlphabet[0]); 

Lưu ý rằng () là vô dụng đối với ưu tiên của các nhà khai thác, vì vậy

char *p3 = &miniAlphabet[0]; 

Trong C/C++ tên của một mảng là một con trỏ đến phần tử đầu tiên của mảng.

Sau đó bạn có thể sử dụng toán con trỏ để làm một số phép thuật ...

này sẽ trỏ đến phần tử thứ hai:

char *p4 = &miniAlphabet[0] + 1; 

như

char *p5 = &miniAlphabet[1]; 

hoặc

char *p6 = miniAlphabet + 1; 
+0

Cảm ơn bạn đã chỉnh sửa, v.clear. –

+0

Xin chào, tôi có một câu hỏi nhanh. khi bạn làm char * p1 = miniAlphabet, p1 bây giờ lưu địa chỉ của phần tử đầu tiên của mảng. Làm thế nào đến, khi chúng ta ra lệnh << p1 << endl, chúng ta lấy toàn bộ mảng char (trong trường hợp này là ABCDE) chứ không phải là địa chỉ của phần tử đầu tiên? –

+0

@DannyBrown Vì tác giả của * cout * đã quyết định như vậy. Nó thậm chí còn có thể viết "hello world" cho bất kỳ con trỏ char * nào, nhưng nó sẽ là ngu ngốc. Điều thông minh nhất để làm nếu bạn đang trong nghề viết văn bản, là in một char * thành một chuỗi. Nếu bạn muốn in một địa chỉ con trỏ, hãy thực hiện * << static_cast (p1) * – xanatos

1

po sition của mảng trong bộ nhớ giống như vị trí của phần tử đầu tiên của nó. Vì vậy, ví dụ, cả hai chữ ký chức năng dưới đây là tương đương:

function changeArray(char[] myArray); 
function changeArray(char* myArray); 

Và bạn có thể gọi một trong hai phiên bản như thế này:

changeArray(miniAlphabet); 

... hoặc

changeArray(&(miniAlphabet[0])); 
+0

Tôi đã có ấn tượng rằng char * là một hằng số được khai báo. Đây là trường hợp, sẽ không phải là chức năng thứ hai không thể thay đổi bất cứ điều gì về mảng char, trong khi đầu tiên có thể? – MintyAnt

+0

Bạn không thể thay đổi giá trị của một char * bên trong hàm, nhưng bạn có thể thay đổi giá trị nó trỏ đến, trong trường hợp này là mảng. Vì vậy, cả hai khai báo cho phép thay đổi mảng ban đầu. – Diego

1

Nếu bạn vượt qua một mảng với hàm, bạn chuyển qua tham chiếu dưới dạng biến mảng thực sự chỉ là con trỏ tới địa chỉ của phần tử đầu tiên trong mảng. Vì vậy, bạn có thể gọi một chức năng như thế này:

funcName(miniAlphabet); 

và nhận mảng "bằng cách tham khảo" như thế này:

void funcName(char *miniAlphabet) { 
    ... 
} 
1

Nói tóm lại, vâng. Khi bạn tạo mảng miniAlphabet là một con trỏ tới mảng của kích thước và kiểu bạn đã xác định. Đó cũng là con trỏ đến phần tử đầu tiên.

Ví dụ về những gì bạn đang đề xuất.

void foo(char *array) 
{ 
    array[0] = 'z'; 
    array[2] = 'z'; 
} 

... 

char myArray[] = { 'a', 'b', 'c'}; 
foo(myArray); 
//myArray now equals {'z', 'b', 'z'} 

cũng lưu ý, dereferencing myArray cung cấp cho bạn giá trị trong phần tử đầu tiên.

Các vấn đề liên quan