我正在遵循一個編程範例教程,並做一些與內存相關的練習。我剛剛提取了兩個問題(請忘記代碼是什麼樣子,對不起,這是不好的代碼,但我只是想從中學到指針的東西)。原始代碼使得lsearch儘可能通用,因此它使用所有指針。數組元素是否在內存中不斷保存?
我有關於訪問數組的一個元素的問題:
當我們訪問數組
a[]
的第四個元素,我們使用*(a+3)
; 當我們訪問字符串數組char * names[]
的第3個元素時,我們使用*(char**)((char*)names+sizeof(char*)*2)
。 我們是否假設數組的元素被連續保存在內存中?問題2有關訪問字符串數組元素:爲什麼我們需要在
names
(基地址)前面加上(char*)
,我儘量不添加(char*)
和代碼與分段錯誤崩潰。我打印的尺寸爲(char*)
,它是8,而sizeof(names)
是32.爲什麼我們在這裏需要(char*)
?我真的認爲地址是32位,如果我們把它轉換成8位,計算機應該很難找到它指向的元素。 謝謝
#include<iostream>
#include<string>
#include<typeinfo>
int main()
{
int a[5] = {1,2,3,4,5};
std::cout << *(a+3) << std::endl;
char* names[4] = {"James", "Dustin", "Rich", "Ed"};
std::cout << *(char**)((char*)names+2*sizeof(char*)) << std::endl;
//std::cout << sizeof(names) << " " << sizeof(char*) << std::endl;
}
下面是從斯坦福107
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int StrCmp(void* vp1, void* vp2)
{
char *s1 = *(char**)vp1;
char *s2 = *(char**)vp2;
if(strcmp(s1,s2)==0){
return 0;
}
return 1;
}
char ** lsearch(void *key, void* base, int size, int elemSize, int (*cmpFn)(void *, void *))
{
for(int i=0; i<size; ++i){
char* addr = (char*) base + elemSize *i;
if (cmpFn(key, addr)==0) return (char**)addr;
}
return NULL;
}
int main()
{
char *notes[] = {"Ab", "F#", "B", "Gb", "D"};
char* favorStr = "F#";
char ** found = lsearch(&favorStr,notes,5,sizeof(char*),StrCmp);
if(found!=NULL) cout << *(char**)found << endl;
else cout << "not found" << endl;
}
'sizeof'以字節爲單位返回大小,而不是位(而你的指針顯然是64位寬)。 – melpomene
這個問題顯示了很少的前期研究,其中一些是錯誤的。檢查標準將回答你關於連續性的問題。檢查數組和/或指針上的一些(更好的)教程可以消除像* *(char **)((char *)名稱+ 2 * sizeof(char *))' –
這樣的神祕構造。另外,如果要使用C++,你應該避免使用舊的C風格的字符串。並不是說他們和你的帖子一樣困難,但爲什麼生活在過去?使用現代C++特性,您根本不必擔心事物是否連續,指針有多寬等。 –