Hỏi về dấu * trong ngôn ngữ C


/**
 * C program to find the first occurrence of a character in a string
 */
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100 // Maximum string size

/* Function declaration */
int indexOf(const char * str, const char toFind);


int main()
{
    char str[MAX_SIZE];
    char toFind;
    int index;

    /* Input string from user and character to be searched */
    printf("Enter any string: ");
    gets(str);
    printf("Enter character to be searched: ");
    toFind = getchar();

    index = indexOf(str, toFind);

    if(index == -1)
        printf("'%c' not found.", toFind);
    else
        printf("'%c' is found at index %d.", toFind, index);

    return 0;
}


/**
 * Returns the first index of the given character toFind in the string. 
 * If returns -1 if the given character toFind does not exists in the string.
 */
int indexOf(const char * str, const char toFind)
{
    int i = 0;

    while(str[i] != '\0')
    {
        if(str[i] == toFind)
            return i;
        i++;
    }

    // Return -1 as character not found
    return -1;
}

Mọi người cho em hỏi ý nghĩa của dấu * trong dòng ‘‘const char * str’’ với ạ.
Em cảm ơn

char* là một kiểu dữ liệu,
char* có thể ép kiểu và sử dụng như char[]

/**
 * C program to find the first occurrence of a character in a string
 */
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100 // Maximum string size

/* Function declaration */
int indexOf(char str[], char toFind);


int main()
{
    char str[MAX_SIZE];
    char toFind;
    int index;

    /* Input string from user and character to be searched */
    printf("Enter any string: ");
    gets(str);
    printf("Enter character to be searched: ");
    toFind = getchar();

    index = indexOf(str, toFind);

    if(index == -1)
        printf("'%c' not found.", toFind);
    else
        printf("'%c' is found at index %d.", toFind, index);

    return 0;
}


/**
 * Returns the first index of the given character toFind in the string.
 * If returns -1 if the given character toFind does not exists in the string.
 */
int indexOf(char str[], char toFind)
{
    int i = 0;

    while(str[i] != '\0')
    {
        if(str[i] == toFind)
            return i;
        i++;
    }

    // Return -1 as character not found
    return -1;
}

Vậy em thay cách gọi đó bằng cách này vẫn đúng chứ ạ

Không được, con trỏ ngoài dùng để ép kiểu còn có tác dụng là “truyền tham chiếu” giống như & trong scanf vậy. Kiểu mảng thì dùng con trỏ để làm việc đó.

Về bản chất em cũng hiểu rồi. Nhưng bài này nếu xài cách trên vẫn được phải ko ạ. Tại mình ko đụng gì đến việc thay đổi giá trị…đơn giản chỉ là dò tìm và đếm

Làm việc với chuỗi ký tự thì nên dùng kiểu con trỏ chuỗi " char * str" để tránh bị lỗi “tràn bộ đệm”. Lỗi này rất nguy hiểm có thể dẫn đến sai lệch kết quả chương trình hoặc crash hoặc là gây mất an toàn( tính bảo mật). Khai báo kiểu con trỏ để nhập vào chuỗi dài bao nhiêu tùy ý, không cần khai báo độ dài trước giúp tránh lỗi trên và cũng là để tối ưu bộ nhớ cho chương trình.

Với tham số thì T* với T[] là một.

Cái này mới tràn bộ đệm này :smiley: các hàm có đuôi _s đều yêu cầu kích thước bộ đệm.

1 Like

Ý nghĩa đơn giản chỉ là dùng địa chỉ của con trỏ head của chuỗi char str[MAX_SIZE] để nắm nguyên chuỗi đó quăng vào function indexOf, truyền như thế để không phải copy ra một bộ nhớ tạm làm giảm performance, nhưng để tránh chuỗi bên ngoài bị thay đổi thì phải thêm const vào.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?