Вопрос касательно указаттелей в задаче из codewars

Пожалуйста помогите!

Я решал задачу про "поиск иголки в мусоре" на codewars. Cамостоятельно решить не получилось и я решил посмотреть решения других участников. В результате, возникли вопросы по поводу указателей.

Условие:

Напишите функцию findNeedle(), которая принимает array полный мусора, но содержит один"needle"

После того, как ваша функция найдет иглу, она должна вернуть сообщение (в виде строки), в котором говорится:

"found the needle at position "плюс index нашел иглу, так что:

Пример (Input --> Output)

["hay", "junk", "hay", "hay", "moreJunk", "needle", "randomJunk"] --> "found the needle at position 5"

Примечание. В COBOL он должен возвращать "found the needle at position 6"

Вопросы:

1й вопрос: почему метод find_needle принимает указатель на указатель const char** haystack, а не const char* haystack?

2й вопрос: почему в данной строке if (!strcmp(haystack[i], "needle")) нет вот такого разыменования: *haystack[i] ?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
char* find_needle(const char** haystack, size_t count)
{
    for (int i = 0; i < count; ++i)
    {
        if (!strcmp(haystack[i], "needle")) // strcmp will return 0 if true, so we need '!' to it to work
        {
            char* buff = malloc(36);
            sprintf(buff, "found the needle at position %d", i);
            return buff;
        }
    }
}
int main() {
    const char* haystack[] = { "3", "123124234", "None", "needle", "world", "hay", "2", "3" };
    char* received = find_needle(haystack, sizeof(haystack) / sizeof(haystack[0]));
    printf("%s",received);
}

Я новичек в программировании на си, поэтому для меня есть много еще не очевидных моментов, спасибо всем, кто придет на помощь!


Ответы (2 шт):

Автор решения: Harry

1й вопрос: почему метод find_needle принимает указатель на указатель const char** haystack, а не const char* haystack?

Потому что в функцию передается весь массив, а const char* - это тип элемента массива haystack, а не самого массива (указателя на первый элемент).

2й вопрос: почему в данной строке if (!strcmp(haystack[i], "needle")) нет вот такого разыменования: *haystack[i] ?

Потому что haystack[i] — это элемент массива, который содержит указатели на const char, т.е. по сути строки в представлении С. То, что предлагаете вы — *haystack[i] — это первый символ строки, на которую указывает haystack[i].

→ Ссылка
Автор решения: rusgeli
  1. char - символ, char* - указатель на начало строки, char** - указатель на начало массива строк. У вас в функцию должен передаваться указатель на массив, если вы хотите перебирать его в функции.
  2. по той же причине здесь нет разыменования. Если вы попытаетесь сделать подобного рода разыменование, то получите символ i-ый символ первой строки в массиве, а для работы strcmp нужна именно строка. haystack[i] - и есть строка массива, которая обрабатывается в данный момент
→ Ссылка