0% found this document useful (0 votes)
5 views

PDF Pointers in C Programming A Modern Approach to Memory Management Recursive Data Structures Strings and Arrays 1st Edition Thomas Mailund download

The document promotes the ebook 'Pointers in C Programming: A Modern Approach to Memory Management, Recursive Data Structures, Strings, and Arrays' by Thomas Mailund, available for download on ebookmeta.com. It includes links to additional recommended digital products related to programming and data structures. The ebook covers various topics including memory management, pointers, arrays, strings, and linked lists.

Uploaded by

escoeknoopfz
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views

PDF Pointers in C Programming A Modern Approach to Memory Management Recursive Data Structures Strings and Arrays 1st Edition Thomas Mailund download

The document promotes the ebook 'Pointers in C Programming: A Modern Approach to Memory Management, Recursive Data Structures, Strings, and Arrays' by Thomas Mailund, available for download on ebookmeta.com. It includes links to additional recommended digital products related to programming and data structures. The ebook covers various topics including memory management, pointers, arrays, strings, and linked lists.

Uploaded by

escoeknoopfz
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 40

Get the full ebook with Bonus Features for a Better Reading Experience on ebookmeta.

com

Pointers in C Programming A Modern Approach to


Memory Management Recursive Data Structures
Strings and Arrays 1st Edition Thomas Mailund

https://ebookmeta.com/product/pointers-in-c-programming-a-
modern-approach-to-memory-management-recursive-data-
structures-strings-and-arrays-1st-edition-thomas-mailund/

OR CLICK HERE

DOWLOAD NOW

Download more ebook instantly today at https://ebookmeta.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Functional Data Structures in R 1st Edition Thomas Mailund

https://ebookmeta.com/product/functional-data-structures-in-r-1st-
edition-thomas-mailund/

ebookmeta.com

Functional Programming in R 4: Advanced Statistical


Programming for Data Science, Analysis, and Finance -
Second Edition Thomas Mailund
https://ebookmeta.com/product/functional-programming-in-r-4-advanced-
statistical-programming-for-data-science-analysis-and-finance-second-
edition-thomas-mailund/
ebookmeta.com

Functional Programming in R 4 - Second Edition Thomas


Mailund

https://ebookmeta.com/product/functional-programming-in-r-4-second-
edition-thomas-mailund/

ebookmeta.com

Microwave Plasma Sources and Methods in Processing


Technology 1st Edition Ladislav Bardos

https://ebookmeta.com/product/microwave-plasma-sources-and-methods-in-
processing-technology-1st-edition-ladislav-bardos/

ebookmeta.com
Losing Face Shame Society and the Self in Early Modern
England 1st Edition Ilana Krausman Ben Amos

https://ebookmeta.com/product/losing-face-shame-society-and-the-self-
in-early-modern-england-1st-edition-ilana-krausman-ben-amos/

ebookmeta.com

Fall Into Savagery: Men of Wrath, Book 3 Do

https://ebookmeta.com/product/fall-into-savagery-men-of-wrath-
book-3-do/

ebookmeta.com

The Cultural Heritage of Nagaland 1st Edition G. Kanato


Chophy

https://ebookmeta.com/product/the-cultural-heritage-of-nagaland-1st-
edition-g-kanato-chophy/

ebookmeta.com

Hegel and Modern Philosophy 1st Edition David Lamb

https://ebookmeta.com/product/hegel-and-modern-philosophy-1st-edition-
david-lamb/

ebookmeta.com

Organic Semiconductors for Optoelectronics 1st Edition


Hiroyoshi Naito

https://ebookmeta.com/product/organic-semiconductors-for-
optoelectronics-1st-edition-hiroyoshi-naito/

ebookmeta.com
Conflict After the Cold War Arguments on Causes of War and
Peace 6th Edition Richard K Betts

https://ebookmeta.com/product/conflict-after-the-cold-war-arguments-
on-causes-of-war-and-peace-6th-edition-richard-k-betts/

ebookmeta.com
Pointers in C
Programming
A Modern Approach to Memory
Management, Recursive Data Structures,
Strings, and Arrays

Thomas Mailund
Pointers in C
Programming
A Modern Approach to Memory
Management, Recursive Data
Structures, Strings, and Arrays

Thomas Mailund
Pointers in C Programming: A Modern Approach to Memory Management, Recursive
Data Structures, Strings, and Arrays
Thomas Mailund
Aarhus N, Denmark

ISBN-13 (pbk): 978-1-4842-6926-8 ISBN-13 (electronic): 978-1-4842-6927-5


https://doi.org/10.1007/978-1-4842-6927-5

Copyright © 2021 by Thomas Mailund


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not
identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the
material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Steve Anglin
Development Editor: Matthew Moodie
Coordinating Editor: Mark Powers
Cover designed by eStudioCalamar
Cover image by Engin Akyurt on Unsplash (www.unsplash.com)
Distributed to the book trade worldwide by Apress Media, LLC, 1 New York Plaza, New York, NY 10004,
U.S.A. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail [email protected], or visit
www.springeronline.com. Apress Media, LLC is a California LLC and the sole member (owner) is Springer
Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a Delaware corporation.
For information on translations, please e-mail [email protected]; for reprint,
paperback, or audio rights, please e-mail [email protected].
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub via the book’s product page, located at www.apress.com/9781484269268. For more
detailed information, please visit http://www.apress.com/source-­code.
Printed on acid-free paper
Table of Contents
About the Author����������������������������������������������������������������������������������������������������� ix

About the Technical Reviewer��������������������������������������������������������������������������������� xi


Acknowledgments������������������������������������������������������������������������������������������������� xiii

Chapter 1: Introduction�������������������������������������������������������������������������������������������� 1

Chapter 2: Memory, Objects, and Addresses������������������������������������������������������������ 3


The Memory of a Generic Process������������������������������������������������������������������������������������������������ 6
Objects, Sizes, and Addresses������������������������������������������������������������������������������������������������������ 9
Memory Allocation���������������������������������������������������������������������������������������������������������������������� 13
Alignment������������������������������������������������������������������������������������������������������������������������������������ 19
Call Stacks and the Lifetime of Local Variables�������������������������������������������������������������������������� 28

Chapter 3: Pointers������������������������������������������������������������������������������������������������� 33
Call by Reference������������������������������������������������������������������������������������������������������������������������ 36
NULL Pointers����������������������������������������������������������������������������������������������������������������������������� 49
Const and Pointers���������������������������������������������������������������������������������������������������������������������� 53
Restricted Pointers���������������������������������������������������������������������������������������������������������������������� 66

Chapter 4: Pointers and Types�������������������������������������������������������������������������������� 69


Pointers, Types, and Data Interpretation������������������������������������������������������������������������������������� 70
Casting Between Pointers of Different Types������������������������������������������������������������������������������ 79
Void Pointers�������������������������������������������������������������������������������������������������������������������������� 79
Qualified Types���������������������������������������������������������������������������������������������������������������������� 80
Unions������������������������������������������������������������������������������������������������������������������������������������ 80
Struct Pointers����������������������������������������������������������������������������������������������������������������������� 81

iii
Table of Contents

Character Pointers����������������������������������������������������������������������������������������������������������������� 81
Arbitrary Types����������������������������������������������������������������������������������������������������������������������� 82
Void Pointers������������������������������������������������������������������������������������������������������������������������������� 85

Chapter 5: Arrays���������������������������������������������������������������������������������������������������� 91
Arrays, Indices, and Pointer Arithmetic��������������������������������������������������������������������������������������� 94
Out-of-Bounds Errors���������������������������������������������������������������������������������������������������������������� 100
Pointers to Arrays���������������������������������������������������������������������������������������������������������������������� 101
Arrays and Function Arguments������������������������������������������������������������������������������������������������ 102
Multidimensional Arrays����������������������������������������������������������������������������������������������������������� 106

Chapter 6: Working with Arrays��������������������������������������������������������������������������� 123


Sieve of Eratosthenes��������������������������������������������������������������������������������������������������������������� 128
Array Solution���������������������������������������������������������������������������������������������������������������������� 128
Pointer Solution������������������������������������������������������������������������������������������������������������������� 130
Radix Sorting����������������������������������������������������������������������������������������������������������������������� 135
Generic Functions on Arrays����������������������������������������������������������������������������������������������������� 147

Chapter 7: Strings������������������������������������������������������������������������������������������������� 157


Strings as Sequences of Bytes������������������������������������������������������������������������������������������������� 158
Integers to Strings�������������������������������������������������������������������������������������������������������������������� 165
Run-Length Encoding���������������������������������������������������������������������������������������������������������������� 174
Finding Words��������������������������������������������������������������������������������������������������������������������������� 177
Compacting Words�������������������������������������������������������������������������������������������������������������������� 186
Buffer Overflow Errors�������������������������������������������������������������������������������������������������������������� 190

Chapter 8: Substrings Through Ranges���������������������������������������������������������������� 195


Basic Operations����������������������������������������������������������������������������������������������������������������������� 200
Revisiting Word Iterators����������������������������������������������������������������������������������������������������������� 206
Replacing Strings���������������������������������������������������������������������������������������������������������������������� 213

iv
Table of Contents

Chapter 9: Dynamic Memory Management���������������������������������������������������������� 219


Functions for Dynamic Memory Allocation������������������������������������������������������������������������������� 220
malloc()���������������������������������������������������������������������������������������������������������������������������� 220
calloc()���������������������������������������������������������������������������������������������������������������������������� 223
realloc()�������������������������������������������������������������������������������������������������������������������������� 225
aligned_alloc()������������������������������������������������������������������������������������������������������������� 228
free()�������������������������������������������������������������������������������������������������������������������������������� 229
String Operations���������������������������������������������������������������������������������������������������������������������� 230
Dynamic Arrays������������������������������������������������������������������������������������������������������������������������� 239
Gapped Buffers������������������������������������������������������������������������������������������������������������������������� 250

Chapter 10: Generic Dynamic Arrays�������������������������������������������������������������������� 259


Void Pointers����������������������������������������������������������������������������������������������������������������������������� 260
Generic Memory Buffer������������������������������������������������������������������������������������������������������������� 265
Code Generating Macros����������������������������������������������������������������������������������������������������������� 270
Inlining Macros������������������������������������������������������������������������������������������������������������������������� 275
Heap-Allocated Inlined Array���������������������������������������������������������������������������������������������������� 286

Chapter 11: Linked Lists��������������������������������������������������������������������������������������� 305


Singly Linked Lists�������������������������������������������������������������������������������������������������������������������� 307
Adding a Level of Indirection���������������������������������������������������������������������������������������������������� 321
Adding a Dummy Element��������������������������������������������������������������������������������������������������������� 329
Doubly Linked Lists������������������������������������������������������������������������������������������������������������������� 334
Link Operations������������������������������������������������������������������������������������������������������������������������� 338
List Operations�������������������������������������������������������������������������������������������������������������������������� 345
Sorting Doubly Linked Lists������������������������������������������������������������������������������������������������������ 358
Selection Sort���������������������������������������������������������������������������������������������������������������������� 359
Insertion Sort����������������������������������������������������������������������������������������������������������������������� 362
Merge Sort��������������������������������������������������������������������������������������������������������������������������� 364
Quicksort����������������������������������������������������������������������������������������������������������������������������� 367

v
Table of Contents

Chapter 12: Search Trees�������������������������������������������������������������������������������������� 371


Tree Operations������������������������������������������������������������������������������������������������������������������������� 372
Contains������������������������������������������������������������������������������������������������������������������������������� 372
Insert����������������������������������������������������������������������������������������������������������������������������������� 373
Delete���������������������������������������������������������������������������������������������������������������������������������� 373
Free������������������������������������������������������������������������������������������������������������������������������������� 375
Recursive Data Structures and Recursive Functions���������������������������������������������������������� 375
Direct Implementation�������������������������������������������������������������������������������������������������������������� 377
Pass by Reference�������������������������������������������������������������������������������������������������������������������� 383
Refactoring������������������������������������������������������������������������������������������������������������������������������� 389
Iterative Functions��������������������������������������������������������������������������������������������������������������� 390
Explicit Stacks��������������������������������������������������������������������������������������������������������������������������� 392
Morris Traversal������������������������������������������������������������������������������������������������������������������������ 399
Freeing Nodes Without Recursion and Memory Allocation�������������������������������������������������� 403
Adding a Parent Pointer������������������������������������������������������������������������������������������������������������ 404

Chapter 13: Function Pointers������������������������������������������������������������������������������ 411


Function Pointers for High-Order Functions����������������������������������������������������������������������������� 413
Callbacks���������������������������������������������������������������������������������������������������������������������������������� 416
Generic String Iterator��������������������������������������������������������������������������������������������������������������� 418
Function Pointers for Abstract Data Structures������������������������������������������������������������������������ 421
Function Pointers for Polymorphic Data Structures������������������������������������������������������������������ 428
Single Inheritance Objects and Classes������������������������������������������������������������������������������ 429
A Hierarchy of Expression Classes�������������������������������������������������������������������������������������� 431
Generating Functions���������������������������������������������������������������������������������������������������������������� 440
Tagged Pointers������������������������������������������������������������������������������������������������������������������� 444

Chapter 14: Generic Lists and Trees��������������������������������������������������������������������� 449


Generic Lists����������������������������������������������������������������������������������������������������������������������������� 450
Casting to Links������������������������������������������������������������������������������������������������������������������� 456
Using Offsets����������������������������������������������������������������������������������������������������������������������� 459
Generic Search Trees���������������������������������������������������������������������������������������������������������������� 463

vi
Table of Contents

Chapter 15: Reference Counting Garbage Collection�������������������������������������������� 477


Immutable Links with Reference Counting������������������������������������������������������������������������������� 480
Adding a Compiler Extension (Not Portable!)����������������������������������������������������������������������� 492
A Generic Reference Counter���������������������������������������������������������������������������������������������������� 495
Search Trees with Reference Counting������������������������������������������������������������������������������������� 500
Circular Structures?������������������������������������������������������������������������������������������������������������������ 507

Chapter 16: Allocation Pools�������������������������������������������������������������������������������� 509


A Simple Pool for Tree Nodes���������������������������������������������������������������������������������������������������� 510
Adding Resizing������������������������������������������������������������������������������������������������������������������������ 511
Adding Deallocation������������������������������������������������������������������������������������������������������������������ 514
A Generic Pool��������������������������������������������������������������������������������������������������������������������������� 517

Chapter 17: Conclusions��������������������������������������������������������������������������������������� 525

Index��������������������������������������������������������������������������������������������������������������������� 527

vii
About the Author
Thomas Mailund is an associate professor in bioinformatics at Aarhus University,
Denmark. He has a background in math and computer science. For the past decade,
his main focus has been on genetics and evolutionary studies, particularly comparative
genomics, speciation, and gene flow between emerging species. He has published
String Algorithms in C, R Data Science Quick Reference, The Joys of Hashing, Domain-­
Specific Languages in R, Beginning Data Science in R, Functional Programming in R, and
Metaprogramming in R, all from Apress, as well as other books.

ix
About the Technical Reviewer
Juturi Narsimha Rao has 9 years of experience as a software developer, lead engineer,
project engineer, and individual contributor. His current focus is on advanced supply
chain planning between the manufacturing industries and vendors.

xi
Acknowledgments
I am grateful to Helge Jensen, Anders E. Halager, Irfansha Shaik, and Kristian Ozol for
discussions and comments on earlier drafts of this book.

xiii
CHAPTER 1

Introduction
Pointers and memory management are considered among the most challenging issues
to deal with in low-level programming languages such as C. It is not that pointers are
conceptually difficult to understand, nor is it difficult to comprehend how we can obtain
memory from the operating system and how we return the memory again so it can be
reused. The difficulty stems from the flexibility with which pointers let us manipulate the
entire state of a running program. With pointers, every object anywhere in a program’s
memory is available to us—at least in principle. We can change any bit to our heart’s
desire. No data are safe from our pointers, not even the program that we run—a running
program is nothing but data in the computer’s memory, and in theory, we can modify
our own code as we run it.
With such a power tool, it should hardly surprise that mistakes can be fatal for a
program, and unfortunately, mistakes are easy to make when it comes to pointers. While
pointers do have type information, type safety is minimal when you use them. If you
point somewhere in memory and pronounce that you want “that integer over there,” you
get an integer, no matter what the object “over there” really is. Treat it like an integer,
and it behaves like an integer. Assign a value to it, and may the gods have mercy on your
soul if it was supposed to be something else and something you need later. You have just
destroyed the real object you pointed at.
If you are not careful, any small mistake can crash your program—or worse. If you
accidentally modify the incorrect data in your program, all your output is tainted. If you
are lucky, it is easily detectable, and you are in for a fun few days of debugging. If you
are less fortunate, you can make business decisions based on incorrect output for years
to come, never realizing that the code you wrote is fooling you every time it runs—or
maybe not every time, just on infrequent occasions, so rare that you can never chase
down the problem. When you have bugs caused by pointers (or uninitialized memory),

1
© Thomas Mailund 2021
T. Mailund, Pointers in C Programming, https://doi.org/10.1007/978-1-4842-6927-5_1
Chapter 1 Introduction

they are not always reproducible. Your program’s behavior might depend on which other
programs are running concurrently on the computer. If you start debugging it, any code
you add to the program to examine it will affect its behavior. Loading the program into a
debugger will definitely change the behavior as well. I hope that you will never run into
such bugs—known as Heisenbugs after Heisenberg’s uncertainty principle—but if you
mess around with pointers long enough, you likely will.
It sounds like pointers are something we should stay away from, and many high-level
programming languages do try to avoid them. Instead, they provide alternative language
constructions that are safer to use but provide much of the same functionality that we
need pointers for in C. They are not as powerful but alleviate many of the dangers that
raw memory pointers pose. In low-level languages such as C, we are programming much
closer to the machine. The computer doesn’t understand high-level constructions; it
understands memory and chunks of bits, and in low-level languages, we can manipulate
the computer at this fundamental level. We very rarely need to, nor do we want to, but
when we choose to program in low-level languages, it is to get close to the machine,
where we can write more efficient programs, measured in both speed and memory
usage. And at this level, we get pointers—more efficient, more fundamental, and more
dangerous. If, however, we approach using pointers in a structured manner, we can
achieve the safety of high-level languages and the efficiency of low-level languages. The
burden is on the programmer, rather than the language designer, but we can get the best
of both worlds for anything that you can do in a high-level language—while maintaining
the real power of pointers in the rare cases where you need more.
In this book, I will explain the basic memory model that C programs assume about
the computer they run on and how pointers let us access data anywhere in memory. I will
explain how you get safe access to memory, by allocating blocks of memory you need, so
they are yours to manipulate, and how you can release memory when you no longer need
it, so you do not run out of memory before your computations are done. I will explain how
pointers are essential for building complex data structures and how you can approach this
in a structured way, so they are safe to use. And I will show you how you can use pointers to
functions to implement higher-order functions and polymorphic data structures.
I will not cover basic C programming. This is not an introduction to programming or
the language. I will assume that you already know the basics and will jump directly into
memory and pointers. I will not cover issues related to concurrency and interruptions
and such either. That would lengthen the book substantially, and there are already
excellent books where you can explore this further.

2
CHAPTER 2

Memory, Objects, and


Addresses
Everything you manipulate when you run a computer program, and the program itself,
has to reside somewhere in your computer’s memory—on a disk, in its RAM circuits,
in various levels of cache, or in a CPU’s or GPU’s registers. It is not something we
necessarily think about when we write programs, but it is an obvious truth: if objects
aren’t found somewhere, we cannot work with them. The reason we can get away with
not worrying about memory is that our programming language handles most of the
bookkeeping.
Consider the classical “Hello, world!” program:

#include <stdio.h>

int main(void)
{
  printf("Hello, world\n");
  return 0;
}

We don’t need to think about the computer’s memory when we write it (or execute
it). Still, many objects must necessarily be represented in memory before we can run
the program—the program itself, including the main() function we write ourselves
and the printf() function we get from the runtime system. The two arguments we
give to main(), argc and argv, are stored somewhere, as is the constant string "Hello,
world!\n".

3
© Thomas Mailund 2021
T. Mailund, Pointers in C Programming, https://doi.org/10.1007/978-1-4842-6927-5_2
Chapter 2 Memory, Objects, and Addresses

Or consider a simple function for computing the factorial of a number:

int factorial(int n)
{
  if (n <= 1) return 1;
  else return n * factorial(n - 1);
}

When we call the function, we must store the argument, n, somewhere. In the
recursive case, we call the function again, and in the second call, we need another
parameter n. We need another one because we need to remember the current n so we
can multiply it to the result of the recursion. Each recursive call must have its own n
stored somewhere in memory.
We don’t have to worry about where the functions, variables, and constants live in
memory when we write this code because the C compiler will generate the necessary
machine code to handle it for us. It will allocate the space for constants and variables,
and it handles writing function parameters and assignments to variables into the correct
memory locations. When we read the value in a variable, it handles getting it from the
right memory location for us as well.
However, when we choose to program in a low-level language, like C, the raw
memory is never too far away. It is possible to hide memory entirely from the
programmer, to pretend that objects are floating around somewhere and never wonder
about where that is. However, it comes at a computational overhead, and it limits what
we can do with a program in some ways. Low-level languages do not do this. They let
us get the memory of objects and manipulate the memory directly. We do not do this
willy-nilly because if we did, we would write unmaintainable software. Still, we have the
power, and when we use this power carefully, and in a structured way, we can build the
features that high-level languages provide using a single mental framework and with
little computational overhead.

4
Other documents randomly have
different content
Kultursprachen übersetzten Werke wirkten, der deutschen Zoologie
eine Anerkennung erzwungen, die von keinem anderen Forscher in
ähnlichem Maße ausging und die höchstens der Wirkung Cuviers zu
vergleichen ist. Als Lehrer hat Haeckel eine ausgedehnte Schule von
Entwicklungstheoretikern sowohl wie von mehr empirisch tätigen
Forschern begründet, der die Vertiefung der Entwicklungslehre mit
ihre wesentlichsten Züge verdankt. Der Rahmen unserer Arbeit,
sowie der Umfang und die Aktualität des Stoffes verbietet uns, mehr
als in diesen Andeutungen die geschichtliche Stellung Haeckels zu
umreißen.
Im Anschluß an Haeckel ist W. P r e y e r (1841-1897) vor allem zu
nennen, als der Vertreter der Entwicklungslehre in der Physiologie.
In zahlreichen gedankenreichen Aufsätzen und Werken ist Preyer für
sie eingestanden und hat ihr gesucht auch auf praktisch wichtige
Fragen Einfluß zu verschaffen. Es sind hier besonders
erwähnenswert: Die Seele des Kindes (1882), Die spezielle
Physiologie des Embryo (1884), Naturforschung und Schule (1887),
worin er im Bunde mit Haeckel der Entwicklungslehre Eingang in die
Schule zu erkämpfen sucht. Eine neue Grundlage für die Systematik
der Physiologie brachte Preyers Einleitung in die allgemeine
Physiologie (1883).

4. Amerikanische Zoologie.
Die amerikanische Zoologie setzt mit Beginn des 19.
Jahrhunderts ein, mit B . S . B a r t o n (1766-1815), der über
Faszination durch die Klapperschlange und über das Opossum
schrieb. 1808-1814 erschien die Ornithologie von A . W i l s o n (1766-
1813), B o n a p a r t e komplettierte 1825-1833 Wilsons Werk.
Gleichzeitig erschien R i c h . H a r l a n s Fauna von Amerika und J . D .
G o d m a n s Werk über nordamerikanische Säugetiere (1826-1828).
1847 tritt die Smithsonian Institution in Tätigkeit und damit beginnen
fortgesetzte zoologisch-systematische Studien. 1846 begründet L .
Agassiz das Studium der vergleichenden Anatomie und
Entwicklungsgeschichte nach europäischem Muster in Cambridge
Mass. Neue Impulse gehen sodann von Darwins Werken aus,
insbesondere tritt der hoch begabte und vielseitige E . D . C o p e
(1840-1897) an die Spitze der amerikanischen
Entwicklungstheoretiker und Paläontologen. Der wesentliche
Bestand der amerikanischen Zoologie gehört der unmittelbaren
Gegenwart an und hat eine Ausdehnung angenommen, die für die
positivistisch zersetzte Wissenschaft Europas eine gefährliche und
ebenbürtige Konkurrenz bedeutet.
IX. Zoographie nach der Mitte des
18. Jahrhunderts.

1. Fortbildung der Klassifikation.


Wenn von der weiteren Entwicklung der Zoographie und
Systematik von Linné an im folgenden Abschnitt die Rede ist, so
versteht sich von selbst, daß die Hauptentwicklung sich innerhalb
der französischen Zoologie vollzieht und die Zoologie anderer
Länder auch bei großartigen Leistungen doch meistens nur als
Partnerin, selten aber überlegen an die Seite tritt. Daher fällt ein Teil
des hierhergehörigen Stoffes mit der in den vorhergehenden
Abschnitten behandelten Geschichte zusammen. Vergleichen wir die
Zahl der beschriebenen Arten der wichtigsten Tiergruppen zu Linnés
Zeiten und in der Gegenwart, so erhellt daraus eine solche
Massenzunahme unserer Kenntnis, daß eine Aufsplitterung wie bei
der Zoographie bei der Systematik als notwendige Folge erscheint.
Einer Zusammenstellung von M ö b i u s zufolge haben von der
zehnten Auflage Linnés, also 1758-1898 im ganzen 2700 Autoren
über 400000 Spezies von Tieren bekannt gemacht. Auf die
einzelnen Gruppen entfallen folgende Zahlen:

Zahl der Spezies Ungefähre


in Linnés Zahl der jetzt
Tierklassen Systematik, bekannten
10. Aufl. 1758 Spezies
Säugetiere 183 3 500
Vögel 444 13 000
Reptilien und Amphibien 181 5 000
Fische 414 12 000
Schmetterlinge 542 50 000
Käfer 595 120 000
Hymenoptern 229 38 000
Diptern 190 28 000
Neuroptern 35 2 050
Orthoptern 150 13 000
Hemiptern 195 30 000
Spinnen 78 20 000
Tausendfüßler 16 3 000
Krebse 89 8 000
Pyknogoniden — 150
Würmer 41 8 000
Manteltiere 3 400
Moostiere 35 1 000
Mollusken und Brachiopoden 674 50 000
Echinodermen 29 3 000
Schwämme 11 1 500
Protozoen 28 6 000
Summe der Arten 4 236 418 500

Wenn wir diesen Zeitraum überblicken, so hat sich die scheinbar


einfachste Arbeit, die sorgfältige Beschreibung und die Umgrenzung
der Arten nach übereinstimmenden konstanten Merkmalen, am
meisten gelohnt, in zweiter Linie die Wiedereinführung anatomischer
Prinzipien in die Klassifikation durch Cuvier, endlich die Verknüpfung
mit den Tatsachen der räumlichen und zeitlichen Verbreitung. Relativ
geringer Wert kommt aber den Resultaten der Klassifikation zu, da
durchgehends das reale Band der Blutsverwandtschaft, auch wo es
geahnt wurde, vor 1860 nicht zu Schlußfolgerungen für die
Systematik verwertbar wurde, dann aber zu einer überraschenden
Entwertung gerade der oberen Gruppen des Systems führte,
während die Art ihre praktische Bedeutung behielt. Es kann daher
nicht Aufgabe unserer kurzen Darstellung sein, die Resultate der
Klassifikation ausführlich zu behandeln, vielmehr sind nur die
wichtigsten Fortschritte der Klassifikation sowie die bedeutendsten
Vermehrungen und Bereicherungen unserer Kenntnis durch Reisen
hervorzuheben.
In diesen Dingen zeigt die Periode von Linné bis zur Mitte des
Jahrhunderts stark einheitliche Züge. Reisen zugunsten der Zoologie
werden jetzt nicht nur etwas häufiger, sondern man nimmt geschulte
Naturforscher mit an Bord. Doch ist ihre Tätigkeit noch in erster Linie
auf Sammlung für Museumszwecke berechnet, nicht mit
zootomischen oder physiologischen Absichten verbunden. Die
Museen haben noch den Charakter von Raritätenkammern, ihr Inhalt
ist universal, sie enthalten also nicht getrennte Abteilungen für
Belehrung und wissenschaftliche Arbeit und sind noch an die
europäischen Kulturstätten gebunden, nicht universal verbreitet mit
lokal spezialisierten Absichten; ebenso sind die Tiergärten noch
Schaustellungen fürs Publikum, nicht Versuchsstationen, wie sich
denn auch die Laboratorien noch nicht von den Museen ablösen und
den Lebensbedingungen der zu erforschenden Lebewelt anpassen.
Alle die weiteren Entwicklungen gehören erst der zweiten Hälfte des
Jahrhunderts an.
Es versteht sich fast von selbst, daß die Schilderung einzelner
Tiergruppen unter steigender Spezialisierung an Umfang und
Genauigkeit zunahm. Es würde zu weit führen, wollten wir all dieser
Monographien gedenken, die, abgesehen von den geschichtlich
bedeutungsvollen Persönlichkeiten, eine Menge sorgfältiger und
fleißiger Einzelarbeiter beschäftigt haben. Nach verschiedenen
Seiten sind indes die z o o g r a p h i s c h e n S p e z i a l g e b i e t e zu
allgemeinerer Bedeutung gelangt, wovon hier kurz Notiz genommen
werden muß.
Die Protozoen traten aus dem Zustande eines Lieblingsobjektes
dilettierender Mikroskopiker mit dem Auftreten der Zellenlehre; v o n
S i e b o l d bildete namentlich die Lehre von ihrer Einzelligkeit aus. In
ihrer Bedeutung für die Entwicklungslehre vielfach überschätzt,
gewannen sie wiederum gegen Ende des Jahrhunderts an Aktualität
durch den Einblick in ihren Wert als Krankheitserreger für die
medizinische Zoologie.
Über die Schwämme herrschten anfangs des Jahrhunderts noch
sehr unklare Vorstellungen, bis G r a n t 1826 die Kenntnis ihres Baues
zu fördern begann und die Untersuchung ihrer Entwicklung sie den
Zölenteraten nahe brachte.
Die Gasträaden wurden als Übergangsgruppe zwischen
Protozoen und Metazoen 1876 von Haeckel aufgestellt.
Die Zölenteraten bildeten während des ganzen Jahrhunderts ein
Hauptfeld der Untersuchung für die Fragen des von J . S t e e n s t r u p
entdeckten Generationswechsels, der tierischen Kolonien, der
Ökologie des Meeres (Korallen), sowie insbesondere der
vergleichenden Histologie und Physiologie.
Die Echinodermen erfuhren mit der Ausbildung der marinen
Zoologie konstanten Zuwachs an Arten und Typen (Krinoiden),
bewährten sich als eine der geeignetsten Gruppen zum Vergleich
zwischen lebenden und fossilen Formen. Die wichtigste Entdeckung
auf diesem Gebiet glückte J o h . M ü l l e r , der zuerst ihre
Entwicklungsgeschichte aufhellte.
Die Würmer lösten sich als Gruppe immer mehr aus dem von
Linné geschaffenen Verbande mit den übrigen Wirbellosen, um
jedoch schließlich wieder ganze große Stämme in sich aufzunehmen
(Bryozoa, Brachiopoda). Mit R u d o l p h i , der ihre Artenzahl auf das
Dreifache steigerte, beginnt die Einsicht in die medizinische
Bedeutung der Schmarotzer und ihrer Entwicklungsstadien, die denn
in der Folgezeit die schönsten Entdeckungen zur Reife brachte. Die
Helminthologie wurde dadurch zur Basis einer umfassenderen
Parasitenkunde, die heute die Bakterien und Protozoen einschließt.
Das Studium der Insekten löste sich mit vermehrter Kenntnis der
Arten allmählich mehr aus dem Verbande der übrigen Zoologie, als
je zuvor; doch werden sie stets wieder von hoher theoretischer
Bedeutung, sowie allgemeinere Fragen in der Zoologie auftreten, so
für die vergleichende Anatomie am Anfang, für die Geographie und
Ökologie mehr am Ende des Jahrhunderts.
Die vereinzelten Formen, wie Peripatus, Zephalodiskus,
Myzostoma usw., ja auch die Chordaten werden in ihrer hohen
Bedeutung als Bindeglieder sehr entfernter Stämme erst von der
zweiten Hälfte des Jahrhunderts ab gewürdigt (A . K o w a l e w s k i ,
Entwicklungsgeschichte der Aszidien 1866, von Amphioxus 1867,
der Salpen 1868). Die Mollusken waren durch Cuvier zu klassischen
Objekten der Invertebratenanatomie geworden. Immer mehr trat
daher an Stelle der Konchyliologie, die nur die Schalen
berücksichtigte, das Studium des gesamten Molluskenorganismus
und seiner Entwicklung.
Die Klassifikation der Fische nahm durch Va l e n c i e n n e s einen
glänzenden Anfang. Immer mehr gewannen die Fische an
Wichtigkeit für die Beurteilung des gesamten Vertebratentypus,
wogegen die weitere Klassifikation wenig Befriedigung brachte.
Die Reptilien und Amphibien der Gegenwart erhielten, nächst
den Säugetieren, am meisten ihre Beleuchtung von der Überfülle der
fossilen Formen, die zum Vorschein kamen. Dadurch fiel die auf
Grund der lebenden allein aufgestellte von B r o g n i a r t 1799
vorgenommene Trennung in Reptilien und Amphibien dahin.
Die Vögel boten realen Zuwachs an geographisch interessanten
Formen, namentlich an fossilen und subfossilen. Zu einer
befriedigenden Klassifikation derselben kam es nicht, trotz
anerkennenswerter Versuche, die Anatomie in den Dienst der
Systematik zu stellen.
Wohl die größte Veränderung ist in der Kenntnis der Säugetiere
im Laufe des Jahrhunderts und namentlich gegen Ende desselben
eingetreten. Die Monotremen, die um die Wende des 18.
Jahrhunderts entdeckt wurden, erwiesen sich als Bindeglieder nach
den Reptilien; mit Cuvier begann die Beschreibung der fossilen
Formen, deren Zahl sich am Ende des Jahrhunderts auf ca. 4000
beläuft. Nimmt zunächst die Zahl der Säugetierordnungen,
namentlich auf Grund der Weichteilanatomie zu, so reduziert sie sich
wieder, je mehr fossile Bindeglieder bekannt werden, deren
Reichtum die heutige Säugetierwelt, mit Ausnahme weniger
Gruppen (Nager, Raubtiere, Paarhufer), als eine reduzierte
erscheinen läßt. In der Säugetierklasse bildet sich unsere
Systematik am meisten zu einer genealogischen um durch
Kombination der Verbreitungsgeschichte mit der
Stammesgeschichte. Die Stellung des Menschen schwankt, bis sie
durch Haeckel endgültig fixiert wird.

2. Reisen und Meeresforschung.


Für Naturforscher, wie sie jetzt auf R e i s e n mitgenommen
werden, hatte bereits B u f f o n eine Anleitung verfaßt. In erster Linie
stehen denn auch hier die Franzosen da, so um die Wende des
Jahrhunderts P é r o n , L e s u e u r , L e s s o n , G a r n o t , Q u o y u. G a y m a r d
(1826-1829 Astrolabe), E y d o u x u. S o u l e y e t (1836-1837 Bonite);
aber auch Engländer, Russen (C h a m i s s o 1815-1818 auf dem
Rurik), Nordamerikaner (W i l k e s 1838-1842). A z a r a bereiste
Zentralsüdamerika von 1781-1801, A l e x a n d e r v o n H u m b o l d t mit
B o n p l a n d das nördliche Südamerika (1799-1804), der Prinz W i e d -
Neuwied 1815-1821 Brasilien, 1817 drei österreichische
Naturforscher, darunter N a t t e r e r , sowie S p i x und M a r t i u s , später
R e n g g e r (1818-1826), P ö p p i g , v. Ts c h u d i , C a s t e l n a u und
S c h o m b u r g k ebenfalls verschiedene Gebiete desselben Kontinents.
Auch die Tierwelt Nordamerikas wurde durch eine große Zahl von
Forschern fixiert. Australiens Tierwelt erschloß besonders J o h n
G o u l d von 1838 ab, die Sundainseln insbesondere R a f f l e s ,
H o r s f i e l d und die Holländer R e i n w a r d t und Te m m i n c k , Japan P h i l .
v o n S i e b o l d . Südafrika wurde von A . S m i t h und K . H .
L i c h t e n s t e i n (von 1811 ab Professor in Berlin), Ostafrika von W.
P e t e r s (dem Nachfolger Lichtensteins von 1856 ab in der Professur
der Zoologie zu Berlin) auf seine Fauna erforscht. Nordostafrika
wurde eifrig von deutschen Gelehrten untersucht, so von
E h r e n b e r g , R ü p p e l l , v. H e u g l i n , Algier von M o r i t z W a g n e r (1836-
1838).
Das Studium der Küstenfauna fand namentlich im Mittelmeer
erneute Pflege. Um die Mitte des Jahrhunderts begannen auch C .
E . v. B a e r , J o h . M ü l l e r , K . Vo g t , A g a s s i z u. a. zu zootomischen
und embryologischen Zwecken das Mittelmeer und die Nordsee
aufzusuchen, während ein ganz selbständiger Zweig der marinen
Zoologie in Skandinavien anzusetzen begann. Hier war es nämlich
M . S a r s (1805-1869, ursprünglich Theologe, von 1854 ab Professor
der Zoologie in Christiania), welcher die Küstenfauna Norwegens
eingehend untersuchte (1846), Tiefenzonen aufstellte, die Krinoiden
als noch heute existierende Tiefenformen nachwies. Auch der
Engländer E d w. F o r b e s (1815-1854) hatte 1841-1843 im Ägäischen
Meere Tiefenzonen der Faunen festgestellt, welche namentlich auch
von den Paläontologen zur Erklärung der fossilen Faunen
beigezogen wurden. S a r s , sowie sein Sohn nahmen von 1850 ab an
verschiedenen arktischen Expeditionen teil und brachten eine reiche
Ausbeute an Tiefseeformen zurück. Wyville Thompson sah dieses
Material und bewog B . C a r p e n t e r , den Plan einer Reise eigens zum
Zwecke der Tiefseeforschung aufzunehmen. Infolge des reichen,
nördlich von Schottland gewonnenen Ertrages wurde die
C h a l l e n g e r - E x p e d i t i o n ausgerüstet (1872-1876), an der außer
W y v. T h o m p s o n auch J o h n M u r r a y teilnahm. Diese Expedition
wurde die wissenschaftlich erfolgreichste Seereise. Ihr folgten
zahlreiche ähnliche, aber kleinere Unternehmen in den siebziger und
achtziger Jahren. Neuere, mit großen Hilfsmitteln ausgerüstete
Expeditionen brachten weiteren überraschenden Zuwachs,
namentlich an physiologisch interessanten Lebewesen der Tiefsee.
Das Bedeutendste leisteten die S i b o g a -Expedition, (1898 u. ff.), die
Va l d i v i a -Expedition (1898/1899 unter C . C h u n ) und die Fahrten des
F ü r s t e n A l b e r t I . v o n M o n a c o (von 1887 an). Schon Johannes
Müller hatte ein wachsames Auge auf den „Auftrieb“ des Meeres, der
sich mit feinen Netzen an der Oberfläche fischen läßt. Dieser
Auftrieb, das Plankton, wurde insbesondere von V. H e n s e n , dem
Kieler Physiologen, zum Gegenstand besonderer, auch quantitativer
Untersuchungen gewählt (von 1887 ab), die mit Rücksicht auf die
Ökonomie des Meeres unternommen wurden. S . L o v é n (1809-
1895, von 1840 ab Professor und Direktor des Museums in
Stockholm) brach der Untersuchung des Süßwasserplanktons Bahn.
P. M ü l l e r , ein Skandinavier, begann diese Studien 1870 im Genfer
See fortzusetzen, wodurch die früher an Hand der Flora gepflegten
geographischen Beziehungen zwischen alpiner und nordischer
Lebewelt neue Nahrung fanden.
Aus der Errichtung zoologischer Laboratorien erwuchs bald das
Bedürfnis, solche an die Meeresküste zu verlegen und sie speziell
der Erforschung der Meeresfauna zu widmen. Der Typus dieser
Stationen ist von A . D o h r n (geb. 1840, ehemals Privatdozent in
Jena) geschaffen worden in der Zoologischen Station von Neapel,
deren Gründung, 1870 begonnen, 1874 zur Eröffnung des
Laboratoriums führte, das die Metropole aller ähnlichen
Unternehmungen in allen Weltteilen geworden ist. Die Reihe der
Stationen zur Untersuchung des Süßwassers wurde mit Plön (O .
Z a c h a r i a s 1891) eingeleitet. Anschließend mag hier die Gründung
von Seewasseraquarien im Binnenland erwähnt werden, so
namentlich die des Aquariums im Garten der Zoologischen
Gesellschaft von London (1853), desjenigen im Jardin
d’Acclimatation (1861) sowie des einzigen als selbständiges Institut
errichteten Berliner Aquariums durch A . B r e h m (1869).
So eröffnete sich denn auch für die Zoologie immer mehr eine
Zukunft, die auf dem Wasser liegt. Durch ganz besondere Methoden
des Forschens ist ein Gebiet erschlossen worden, dessen Betreten
zu den geschichtlich eigenartigsten Erscheinungen der Zoographie
des 19. Jahrhunderts gehört.

3. Geschichte und Bibliographie der Zoologie.


Die Geschichte der Zoologie wurde erst spät ein Gegenstand
selbständiger Arbeiten. Das älteste Werk, das die Geschichte der
zoologischen Systeme behandelt, stammt, wenn wir von
gelegentlicher Berührung der Geschichte der Zootomie durch A . v o n
H a l l e r (Bibliotheca anatomica 1777) absehen, von J . S p i x (1811).
Ausführlicher und im Zusammenhang mit der Naturgeschichte
überhaupt stellte C u v i e r in Vorlesungen, die nach seinem Tode erst
erschienen, die Entwicklung der Zoologie dar (1841-1845). Einen
vortrefflichen Abschnitt bildet die Geschichte der Zoologie in I .
G e o f f r o y S t . H i l a i r e s Werk (1854, Bd. I). Wichtige Beiträge zur
Geschichte der Zoologie lieferte J . G . S c h n e i d e r . Auch A . v.
H u m b o l d t s geschichtliche Übersicht (Kosmos, Bd. II, 1847) ist noch
immer beachtenswert. Die Entwicklung der vergleichenden
Anatomie, freilich ohne deren Basis zu berühren, skizzierte O .
S c h m i d t (1855). 1873 erschien J . V. C a r u s ’ Geschichte der
Zoologie, ein Werk von sehr ungleichem Wert seiner Teile, mit dem
Hauptgewicht auf dem Mittelalter, unter literarisch-grammatischer
Behandlung des Stoffes und ohne Kenntnis der antiken Literatur
geschrieben. Eine Übersicht der neueren Zoologie vor Darwin gab
E . P e r r i e r (1884). Ein besonderes Verdienst haben sich im Laufe
des 19. Jahrhunderts die Philologen um die antiken Texte unserer
Wissenschaften erworben und damit historischer Behandlung
derselben Vorschub geleistet. Dies gilt besonders für Aristoteles,
dessen Bearbeitung bis 1870 durch deutsche Forscher (J . B .
M e y e r , F r a n t z i u s , A u b e r t und W i m m e r ) und in Frankreich durch
B a r t h é l e m y S t . H i l a i r e (bis 1890) große Fortschritte gemacht hat.
Über mehrere Zoologen der Neuzeit existieren zwar Biographien,
doch ist der Zusammenhang zwischen den Forschern und ihren
Schulen, namentlich aber die Berührung der Zoologie mit den
übrigen Wissenschaften im ganzen erstaunlich wenig bekannt.
Für die zoologische Bibliographie sind Fundgruben älteren
Datums die Bibliotheca universalis von K . G e s n e r (1545) und die
Bibliotheca anatomica von A . v o n H a l l e r (1774). Umfangreiche, im
Stil der Enzyklopädien gehaltene Lexika der Naturgeschichte
entstanden am Pariser Pflanzengarten 1782 und 1816. L . A g a s s i z
gab (1842-1846) eine Bibliotheca zoologica et palaeontologica
heraus. Von hohem Werte ist die Quellenkunde der vergleichenden
Anatomie von F. W. A ß m a n n (1847). Die umfassendste
Bibliographie schuf A . G ü n t h e r in dem von 1864 ab erscheinenden
Zoological Record. Ihr zur Seite trat die Bibliographie von J . V.
C a r u s im Zoologischen Anzeiger (von 1878 ab). Nachdem bereits
C u v i e r und J o h . M ü l l e r zeitweise Jahresberichte von beschränktem
Umfange verfaßt hatten, organisierte A . D o h r n (seit 1879) in den
Jahresberichten seiner Station die Berichterstattung in umfassender
Weise. Ein besonders auch praktisch zweckmäßiges Hilfsmittel
richtete H . F i e l d (seit 1895) in seinem Concilium bibliographicum
ein.
Register.

Abbe, E. 121.
Agassiz, L. 98, 113, 143, 149, 152.
Albert von Bollstädt, der Große 45.
Albert I. von Monaco 150.
Albinus, B. S. 78.
Alderotto 46.
Aldrovandi, U. 20, 52, 53, 66.
Alexander von Myndos 33.
Älian 38, 48, 49, 50.
Alkmäon von Kroton 16.
Amman 77.
Anaximander 15.
Anaxagoras 16.
Antigonos von Karystos 33.
Aristophanes 17.
Aristophanes von Byzanz 33.
Aristoteles 20–32, 33, 34, 36, 37, 44, 45, 47, 49, 51, 57, 61,
68, 71, 76, 91, 94, 96, 152.
Artedi, P. 74, 75.
Aselli 59.
Aßmann F. W. 152.
Asurnasirabal 11.
Aubert 152.
Audouin, J. V. 97.
Augustinus 41, 42.
Autenrieth 108.
Averrhoës 28.
Avicenna 43.
Azara 149.

Baco, Fr. 58, 59.


Baldassini 101.
Balfour, Fr. 127.
Baer, C. E. von 110, 111, 117, 149.
Barclay 125.
Barthélemy St. Hilaire 21, 152.
Bartholine 60, 61.
Bartholomäus Anglicus 47.
Barton 142.
Belon 50, 53, 55.
Benecke 121.
Beneden, J. P. van 116.
Bering 77.
Bernard, Cl. 79.
Bibron 97.
Bichat 79, 119.
Blainville, Ducrotay de 97.
Blair 70.
Blanchard, E. 97, 98.
Blasius, G. 62.
Blumenbach, J. F. 81, 103.
Bock 47.
Bonaparte 101, 142.
Bonelli, A. 101.
Bonnet, Ch. 71, 72, 73.
Bonpland 149.
Bontius 55.
Borchart 55.
Borelli 60.
Boerhave 64, 72.
Born, G. 121.
Brehm, A. 116, 151.
Brehm, C. L. 116.
Breyn 70.
Brisson 88.
Brogniart 148.
Bronn, G. 114, 118, 137.
Brunfels 47.
Buffon, J. Leclerc de 22, 37, 53, 72, 78, 80, 82, 83–85, 86,
91, 95, 120, 124.
Burmeister, H. 114.

Caldesi 61.
Campanella 57.
Camper, P. 79.
Carpenter, B. 134, 150.
Carus, C. G. 107, 108, 116.
Carus, J. V. 114, 115, 152, 153.
Cäsalpin 55.
Casserio 56.
Castelnau 149.
Cavolini 101.
Cetti 101.
Chiaje, delle 101.
Chun 150.
Claus 115.
Clift, W. 80, 125.
Clusius von Arras 55, 66.
Coiter 57.
Collins 62.
Colombo 56.
Comte, Ach. 99.
Cope, E. D. 143.
Costa, O. G. 101.
Cuvier, Fr. 91, 96, 99.
Cuvier, Georges 22, 37, 51, 88, 89, 90–96, 93, 94, 95, 96,
97, 98, 99, 112, 113, 116, 124, 125, 126, 127.
Cysat 70.

Darwin, Charles 101, 114, 115, 128–135, 136, 137, 138,


139.
Darwin, Erasmus 124, 125, 128, 130.
Daubenton 83, 85, 88, 91.
Demokrit von Abdera 16, 17.
Dempster 53.
Descartes 59.
Diderot 73.
Diogenes von Apollonia 16.
Dionysos 38.
Dohrn, A. 149, 153.
Döllinger, J. 110.
Dugès 99.
Dujardin, F. 97, 120.
Duméril, A. 97.
Duméril, E. 92, 97.
Duverney, J. G. 62, 82.
Duvernoy 92.

Edrisi 43.
Ehrenberg, C. G. 113, 149.
Eimer, Th. 139.
Elucidarius 47.
Empedokles 16.
Epicharm 17.
Erasistratos 39.
Eustachius 57.
Eydoux 148.
Fabricius ab Aquapendente 57.
Fay, du 82.
Field, H. 153.
Fitzroy 130.
Flower, W. 127.
Forbes, Ed. 149.
Frantzius 152.
Franz von Assisi 43.
Friedrich II. von Hohenstaufen 44, 46, 52.
Fuchs, L. 47.
Fulvius, Hirpinus 37.
Furlanus 48.

Galenos 15, 18, 39, 40, 47, 49, 50, 51, 57.
Galilei 58.
Garnot 148.
Gaymard 148.
Gaza 48.
Gegenbaur, K. 117, 118.
Geoffroy St. Hilaire, Etienne 88–90, 91, 92, 95, 96, 99, 104,
112, 122, 125, 126, 133, 134.
Geoffroy St. Hilaire, Isidore 100, 101, 117, 151.
Gesner, K. 20, 51, 52, 53, 152.
Giovio 47.
Gmelin 77.
Godmann 142.
Goldfuß 116.
Goethe 104, 105, 108, 125.
Gould, John 149.
Grant 146.
Gray, Asa 134.
Gray, J. E. 126, 127.
Grew, N. 61.
Gronovius 49, 74.
Güldenstadt 77.
Günther, A. 127, 152.
Gyllius 48.

Haeckel 9, 104, 115, 137, 139, 140-142, 146, 148.


Haller, A. von 71, 72, 79, 80, 90, 102, 122, 151.
Ham, L. von 65.
Hammurabi 11.
Hardouin 48.
Harlan 142.
Hartig 121.
Hartmann, Ed. von 138, 139.
Harvey, W. 59, 60, 65, 80.
Haüy 88.
Hegel 21.
Hemprich 113.
Hensen, V. 150.
Henslow 130.
Herbenstein 54.
Herder, J. G. 103, 104.
Hermann, J. 116.
Hernandez 55.
Herodot 15, 17.
Herophilos 39.
Heuglin, von 149.
Heusinger 109, 123.
Hippokrates 17, 18, 40, 47, 49, 50, 55, 57, 72.
Hippon von Rhegium 16.
His, W. 121.
Home, Ev. 80.
Hooke 119.
Hooker 134.
Horsfield 149.
Humboldt, A. von 81, 82, 103, 113, 149, 152.
Hunter, John 80, 81, 109, 112, 123, 124, 125, 126, 127.
Huxley, Th. H. 118, 128, 134, 136, 137.

Ingrassias 57.
Isidor von Sevilla 42.

Jakob van Maerlandt 46.


Jasolini 57.
Johannes Leo Africanus 47.
Jonston 53.
Jussieu 70.

Kallimachos von Kyrene 33.


Kämpfer 70.

You might also like