1
<refentry id="glib-Pointer-Arrays">
3
<refentrytitle role="top_of_page" id="glib-Pointer-Arrays.top_of_page">Pointer Arrays</refentrytitle>
4
<manvolnum>3</manvolnum>
5
<refmiscinfo>GLIB Library</refmiscinfo>
9
<refname>Pointer Arrays</refname>
10
<refpurpose>arrays of pointers to any type of data, which grow automatically as new
11
elements are added</refpurpose>
12
<!--[<xref linkend="desc" endterm="desc.title"/>]-->
15
<refsynopsisdiv id="glib-Pointer-Arrays.synopsis" role="synopsis">
16
<title role="synopsis.title">Synopsis</title>
20
#include <glib.h>
22
<link linkend="GPtrArray">GPtrArray</link>;
23
<link linkend="GPtrArray">GPtrArray</link>* <link linkend="g-ptr-array-new">g_ptr_array_new</link> (void);
24
<link linkend="GPtrArray">GPtrArray</link>* <link linkend="g-ptr-array-sized-new">g_ptr_array_sized_new</link> (<link linkend="guint">guint</link> reserved_size);
25
<link linkend="void">void</link> <link linkend="g-ptr-array-add">g_ptr_array_add</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
26
<link linkend="gpointer">gpointer</link> data);
27
<link linkend="gboolean">gboolean</link> <link linkend="g-ptr-array-remove">g_ptr_array_remove</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
28
<link linkend="gpointer">gpointer</link> data);
29
<link linkend="gpointer">gpointer</link> <link linkend="g-ptr-array-remove-index">g_ptr_array_remove_index</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
30
<link linkend="guint">guint</link> index_);
31
<link linkend="gboolean">gboolean</link> <link linkend="g-ptr-array-remove-fast">g_ptr_array_remove_fast</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
32
<link linkend="gpointer">gpointer</link> data);
33
<link linkend="gpointer">gpointer</link> <link linkend="g-ptr-array-remove-index-fast">g_ptr_array_remove_index_fast</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
34
<link linkend="guint">guint</link> index_);
35
<link linkend="void">void</link> <link linkend="g-ptr-array-remove-range">g_ptr_array_remove_range</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
36
<link linkend="guint">guint</link> index_,
37
<link linkend="guint">guint</link> length);
38
<link linkend="void">void</link> <link linkend="g-ptr-array-sort">g_ptr_array_sort</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
39
<link linkend="GCompareFunc">GCompareFunc</link> compare_func);
40
<link linkend="void">void</link> <link linkend="g-ptr-array-sort-with-data">g_ptr_array_sort_with_data</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
41
<link linkend="GCompareDataFunc">GCompareDataFunc</link> compare_func,
42
<link linkend="gpointer">gpointer</link> user_data);
43
<link linkend="void">void</link> <link linkend="g-ptr-array-set-size">g_ptr_array_set_size</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
44
<link linkend="gint">gint</link> length);
45
#define <link linkend="g-ptr-array-index">g_ptr_array_index</link> (array,index_)
46
<link linkend="gpointer">gpointer</link>* <link linkend="g-ptr-array-free">g_ptr_array_free</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
47
<link linkend="gboolean">gboolean</link> free_seg);
48
<link linkend="void">void</link> <link linkend="g-ptr-array-foreach">g_ptr_array_foreach</link> (<link linkend="GPtrArray">GPtrArray</link> *array,
49
<link linkend="GFunc">GFunc</link> func,
50
<link linkend="gpointer">gpointer</link> user_data);
62
<refsect1 id="glib-Pointer-Arrays.description" role="desc">
63
<title role="desc.title">Description</title>
65
Pointer Arrays are similar to Arrays but are used only for storing pointers.
69
If you remove elements from the array, elements at the end of the array
70
are moved into the space previously occupied by the removed element.
71
This means that you should not rely on the index of particular elements
72
remaining the same. You should also be careful when deleting elements while
73
iterating over the array.
77
To create a pointer array, use <link linkend="g-ptr-array-new"><function>g_ptr_array_new()</function></link>.
80
To add elements to a pointer array, use <link linkend="g-ptr-array-add"><function>g_ptr_array_add()</function></link>.
83
To remove elements from a pointer array, use <link linkend="g-ptr-array-remove"><function>g_ptr_array_remove()</function></link>,
84
<link linkend="g-ptr-array-remove-index"><function>g_ptr_array_remove_index()</function></link> or <link linkend="g-ptr-array-remove-index-fast"><function>g_ptr_array_remove_index_fast()</function></link>.
87
To access an element of a pointer array, use <link linkend="g-ptr-array-index"><function>g_ptr_array_index()</function></link>.
90
To set the size of a pointer array, use <link linkend="g-ptr-array-set-size"><function>g_ptr_array_set_size()</function></link>.
93
To free a pointer array, use <link linkend="g-ptr-array-free"><function>g_ptr_array_free()</function></link>.
96
<title>Using a <structname>GPtrArray</structname></title>
99
gchar *string1 = "one", *string2 = "two", *string3 = "three";
101
gparray = g_ptr_array_new (<!-- -->);
102
g_ptr_array_add (gparray, (gpointer) string1);
103
g_ptr_array_add (gparray, (gpointer) string2);
104
g_ptr_array_add (gparray, (gpointer) string3);
106
if (g_ptr_array_index (gparray, 0) != (gpointer) string1)
107
g_print ("ERROR: got %p instead of %p\n",
108
g_ptr_array_index (gparray, 0), string1);
110
g_ptr_array_free (gparray, TRUE);
111
</programlisting></example>
114
<refsect1 id="glib-Pointer-Arrays.details" role="details">
115
<title role="details.title">Details</title>
116
<refsect2 id="GPtrArray" role="struct">
117
<title>GPtrArray</title>
118
<indexterm zone="GPtrArray"><primary>GPtrArray</primary></indexterm><programlisting>typedef struct {
124
Contains the public fields of a pointer array.
125
</para><variablelist role="struct">
127
<term><link linkend="gpointer">gpointer</link> *<structfield>pdata</structfield>;</term>
128
<listitem><simpara>points to the array of pointers, which may be moved when the array grows.
129
</simpara></listitem>
132
<term><link linkend="guint">guint</link> <structfield>len</structfield>;</term>
133
<listitem><simpara>number of pointers in the array.
135
</simpara></listitem>
137
</variablelist></refsect2>
138
<refsect2 id="g-ptr-array-new" role="function">
139
<title>g_ptr_array_new ()</title>
140
<indexterm zone="g-ptr-array-new"><primary>g_ptr_array_new</primary></indexterm><programlisting><link linkend="GPtrArray">GPtrArray</link>* g_ptr_array_new (void);</programlisting>
142
Creates a new <link linkend="GPtrArray"><type>GPtrArray</type></link>.
143
</para><variablelist role="params">
144
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara>the new <link linkend="GPtrArray"><type>GPtrArray</type></link>.
147
</simpara></listitem></varlistentry>
148
</variablelist></refsect2>
149
<refsect2 id="g-ptr-array-sized-new" role="function">
150
<title>g_ptr_array_sized_new ()</title>
151
<indexterm zone="g-ptr-array-sized-new"><primary>g_ptr_array_sized_new</primary></indexterm><programlisting><link linkend="GPtrArray">GPtrArray</link>* g_ptr_array_sized_new (<link linkend="guint">guint</link> reserved_size);</programlisting>
153
Creates a new <link linkend="GPtrArray"><type>GPtrArray</type></link> with <parameter>reserved_size</parameter> pointers
154
preallocated. This avoids frequent reallocation, if you are going to
155
add many pointers to the array. Note however that the size of the
157
</para><variablelist role="params">
158
<varlistentry><term><parameter>reserved_size</parameter> :</term>
159
<listitem><simpara>number of pointers preallocated.
160
</simpara></listitem></varlistentry>
161
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara>the new <link linkend="GPtrArray"><type>GPtrArray</type></link>.
164
</simpara></listitem></varlistentry>
165
</variablelist></refsect2>
166
<refsect2 id="g-ptr-array-add" role="function">
167
<title>g_ptr_array_add ()</title>
168
<indexterm zone="g-ptr-array-add"><primary>g_ptr_array_add</primary></indexterm><programlisting><link linkend="void">void</link> g_ptr_array_add (<link linkend="GPtrArray">GPtrArray</link> *array,
169
<link linkend="gpointer">gpointer</link> data);</programlisting>
171
Adds a pointer to the end of the pointer array.
172
The array will grow in size automatically if necessary.
173
</para><variablelist role="params">
174
<varlistentry><term><parameter>array</parameter> :</term>
175
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
176
</simpara></listitem></varlistentry>
177
<varlistentry><term><parameter>data</parameter> :</term>
178
<listitem><simpara>the pointer to add.
181
</simpara></listitem></varlistentry>
182
</variablelist></refsect2>
183
<refsect2 id="g-ptr-array-remove" role="function">
184
<title>g_ptr_array_remove ()</title>
185
<indexterm zone="g-ptr-array-remove"><primary>g_ptr_array_remove</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link> g_ptr_array_remove (<link linkend="GPtrArray">GPtrArray</link> *array,
186
<link linkend="gpointer">gpointer</link> data);</programlisting>
188
Removes the first occurrence of the given pointer from the pointer array.
189
The following elements are moved down one place.
192
It returns <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> if the pointer was removed, or <link linkend="FALSE:CAPS"><literal>FALSE</literal></link> if the pointer
194
</para><variablelist role="params">
195
<varlistentry><term><parameter>array</parameter> :</term>
196
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
197
</simpara></listitem></varlistentry>
198
<varlistentry><term><parameter>data</parameter> :</term>
199
<listitem><simpara>the pointer to remove.
200
</simpara></listitem></varlistentry>
201
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara><link linkend="TRUE:CAPS"><literal>TRUE</literal></link> if the pointer is removed. <link linkend="FALSE:CAPS"><literal>FALSE</literal></link> if the pointer is not found
205
</simpara></listitem></varlistentry>
206
</variablelist></refsect2>
207
<refsect2 id="g-ptr-array-remove-index" role="function">
208
<title>g_ptr_array_remove_index ()</title>
209
<indexterm zone="g-ptr-array-remove-index"><primary>g_ptr_array_remove_index</primary></indexterm><programlisting><link linkend="gpointer">gpointer</link> g_ptr_array_remove_index (<link linkend="GPtrArray">GPtrArray</link> *array,
210
<link linkend="guint">guint</link> index_);</programlisting>
212
Removes the pointer at the given index from the pointer array.
213
The following elements are moved down one place.
214
</para><variablelist role="params">
215
<varlistentry><term><parameter>array</parameter> :</term>
216
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
217
</simpara></listitem></varlistentry>
218
<varlistentry><term><parameter>index_</parameter> :</term>
219
<listitem><simpara>the index of the pointer to remove.
220
</simpara></listitem></varlistentry>
221
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara>the pointer which was removed.
224
</simpara></listitem></varlistentry>
225
</variablelist></refsect2>
226
<refsect2 id="g-ptr-array-remove-fast" role="function">
227
<title>g_ptr_array_remove_fast ()</title>
228
<indexterm zone="g-ptr-array-remove-fast"><primary>g_ptr_array_remove_fast</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link> g_ptr_array_remove_fast (<link linkend="GPtrArray">GPtrArray</link> *array,
229
<link linkend="gpointer">gpointer</link> data);</programlisting>
231
Removes the first occurrence of the given pointer from the pointer array.
232
The last element in the array is used to fill in the space, so this function
233
does not preserve the order of the array. But it is faster than
234
<link linkend="g-ptr-array-remove"><function>g_ptr_array_remove()</function></link>.
237
It returns <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> if the pointer was removed, or <link linkend="FALSE:CAPS"><literal>FALSE</literal></link> if the pointer
239
</para><variablelist role="params">
240
<varlistentry><term><parameter>array</parameter> :</term>
241
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
242
</simpara></listitem></varlistentry>
243
<varlistentry><term><parameter>data</parameter> :</term>
244
<listitem><simpara>the pointer to remove.
245
</simpara></listitem></varlistentry>
246
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara><link linkend="TRUE:CAPS"><literal>TRUE</literal></link> if the pointer was found in the array.
249
</simpara></listitem></varlistentry>
250
</variablelist></refsect2>
251
<refsect2 id="g-ptr-array-remove-index-fast" role="function">
252
<title>g_ptr_array_remove_index_fast ()</title>
253
<indexterm zone="g-ptr-array-remove-index-fast"><primary>g_ptr_array_remove_index_fast</primary></indexterm><programlisting><link linkend="gpointer">gpointer</link> g_ptr_array_remove_index_fast (<link linkend="GPtrArray">GPtrArray</link> *array,
254
<link linkend="guint">guint</link> index_);</programlisting>
256
Removes the pointer at the given index from the pointer array.
257
The last element in the array is used to fill in the space, so this function
258
does not preserve the order of the array. But it is faster than
259
<link linkend="g-ptr-array-remove-index"><function>g_ptr_array_remove_index()</function></link>.
260
</para><variablelist role="params">
261
<varlistentry><term><parameter>array</parameter> :</term>
262
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
263
</simpara></listitem></varlistentry>
264
<varlistentry><term><parameter>index_</parameter> :</term>
265
<listitem><simpara>the index of the pointer to remove.
266
</simpara></listitem></varlistentry>
267
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara>the pointer which was removed.
270
</simpara></listitem></varlistentry>
271
</variablelist></refsect2>
272
<refsect2 id="g-ptr-array-remove-range" role="function" condition="since:2.4">
273
<title>g_ptr_array_remove_range ()</title>
274
<indexterm zone="g-ptr-array-remove-range" role="2.4"><primary>g_ptr_array_remove_range</primary></indexterm><programlisting><link linkend="void">void</link> g_ptr_array_remove_range (<link linkend="GPtrArray">GPtrArray</link> *array,
275
<link linkend="guint">guint</link> index_,
276
<link linkend="guint">guint</link> length);</programlisting>
278
Removes the given number of pointers starting at the given index from a
279
<link linkend="GPtrArray"><type>GPtrArray</type></link>. The following elements are moved to close the gap.
280
</para><variablelist role="params">
281
<varlistentry><term><parameter>array</parameter> :</term>
282
<listitem><simpara>a <parameter>GPtrArray</parameter>.
283
</simpara></listitem></varlistentry>
284
<varlistentry><term><parameter>index_</parameter> :</term>
285
<listitem><simpara>the index of the first pointer to remove.
286
</simpara></listitem></varlistentry>
287
<varlistentry><term><parameter>length</parameter> :</term>
288
<listitem><simpara>the number of pointers to remove.
289
</simpara></listitem></varlistentry>
290
</variablelist><para role="since">Since 2.4
294
<refsect2 id="g-ptr-array-sort" role="function">
295
<title>g_ptr_array_sort ()</title>
296
<indexterm zone="g-ptr-array-sort"><primary>g_ptr_array_sort</primary></indexterm><programlisting><link linkend="void">void</link> g_ptr_array_sort (<link linkend="GPtrArray">GPtrArray</link> *array,
297
<link linkend="GCompareFunc">GCompareFunc</link> compare_func);</programlisting>
299
Sorts the array, using <parameter>compare_func</parameter> which should be a <link linkend="qsort"><function>qsort()</function></link>-style comparison
300
function (returns less than zero for first arg is less than second arg,
301
zero for equal, greater than zero if irst arg is greater than second arg).
304
If two array elements compare equal, their order in the sorted array is
308
The comparison function for <link linkend="g-ptr-array-sort"><function>g_ptr_array_sort()</function></link> doesn't take the pointers
309
from the array as arguments, it takes pointers to the pointers in the array.
310
</para></note><variablelist role="params">
311
<varlistentry><term><parameter>array</parameter> :</term>
312
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
313
</simpara></listitem></varlistentry>
314
<varlistentry><term><parameter>compare_func</parameter> :</term>
315
<listitem><simpara>comparison function.
318
</simpara></listitem></varlistentry>
319
</variablelist></refsect2>
320
<refsect2 id="g-ptr-array-sort-with-data" role="function">
321
<title>g_ptr_array_sort_with_data ()</title>
322
<indexterm zone="g-ptr-array-sort-with-data"><primary>g_ptr_array_sort_with_data</primary></indexterm><programlisting><link linkend="void">void</link> g_ptr_array_sort_with_data (<link linkend="GPtrArray">GPtrArray</link> *array,
323
<link linkend="GCompareDataFunc">GCompareDataFunc</link> compare_func,
324
<link linkend="gpointer">gpointer</link> user_data);</programlisting>
326
Like <link linkend="g-ptr-array-sort"><function>g_ptr_array_sort()</function></link>, but the comparison function has an extra user data
330
The comparison function for <link linkend="g-ptr-array-sort-with-data"><function>g_ptr_array_sort_with_data()</function></link> doesn't take the
331
pointers from the array as arguments, it takes pointers to the pointers in
333
</para></note><variablelist role="params">
334
<varlistentry><term><parameter>array</parameter> :</term>
335
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
336
</simpara></listitem></varlistentry>
337
<varlistentry><term><parameter>compare_func</parameter> :</term>
338
<listitem><simpara>comparison function.
339
</simpara></listitem></varlistentry>
340
<varlistentry><term><parameter>user_data</parameter> :</term>
341
<listitem><simpara>data to pass to <parameter>compare_func</parameter>.
344
</simpara></listitem></varlistentry>
345
</variablelist></refsect2>
346
<refsect2 id="g-ptr-array-set-size" role="function">
347
<title>g_ptr_array_set_size ()</title>
348
<indexterm zone="g-ptr-array-set-size"><primary>g_ptr_array_set_size</primary></indexterm><programlisting><link linkend="void">void</link> g_ptr_array_set_size (<link linkend="GPtrArray">GPtrArray</link> *array,
349
<link linkend="gint">gint</link> length);</programlisting>
351
Sets the size of the array, expanding it if necessary.
352
New elements are set to <link linkend="NULL:CAPS"><literal>NULL</literal></link>.
353
</para><variablelist role="params">
354
<varlistentry><term><parameter>array</parameter> :</term>
355
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
356
</simpara></listitem></varlistentry>
357
<varlistentry><term><parameter>length</parameter> :</term>
358
<listitem><simpara>the new length of the pointer array.
361
</simpara></listitem></varlistentry>
362
</variablelist></refsect2>
363
<refsect2 id="g-ptr-array-index" role="macro">
364
<title>g_ptr_array_index()</title>
365
<indexterm zone="g-ptr-array-index"><primary>g_ptr_array_index</primary></indexterm><programlisting>#define g_ptr_array_index(array,index_)</programlisting>
367
Returns the pointer at the given index of the pointer array.
368
</para><variablelist role="params">
369
<varlistentry><term><parameter>array</parameter> :</term>
370
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
371
</simpara></listitem></varlistentry>
372
<varlistentry><term><parameter>index_</parameter> :</term>
373
<listitem><simpara>the index of the pointer to return.
374
</simpara></listitem></varlistentry>
375
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara>the pointer at the given index.
378
</simpara></listitem></varlistentry>
379
</variablelist></refsect2>
380
<refsect2 id="g-ptr-array-free" role="function">
381
<title>g_ptr_array_free ()</title>
382
<indexterm zone="g-ptr-array-free"><primary>g_ptr_array_free</primary></indexterm><programlisting><link linkend="gpointer">gpointer</link>* g_ptr_array_free (<link linkend="GPtrArray">GPtrArray</link> *array,
383
<link linkend="gboolean">gboolean</link> free_seg);</programlisting>
385
Frees the memory allocated for the <link linkend="GPtrArray"><type>GPtrArray</type></link>.
386
If <parameter>free_segment</parameter> is <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> it frees the memory block holding the elements
387
as well. Pass <link linkend="FALSE:CAPS"><literal>FALSE</literal></link> if you want to free the <link linkend="GPtrArray"><type>GPtrArray</type></link> wrapper but preserve
388
the underlying array for use elsewhere.
392
If array contents point to dynamically-allocated memory, they should be freed
395
</note><variablelist role="params">
396
<varlistentry><term><parameter>array</parameter> :</term>
397
<listitem><simpara>a <link linkend="GPtrArray"><type>GPtrArray</type></link>.
398
</simpara></listitem></varlistentry>
399
<varlistentry><term><parameter>free_seg</parameter> :</term>
400
<listitem><simpara>if <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> the actual pointer array is freed as well.
401
</simpara></listitem></varlistentry>
402
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara>the pointer array if <parameter>free_seg</parameter> is <link linkend="FALSE:CAPS"><literal>FALSE</literal></link>, otherwise <link linkend="NULL:CAPS"><literal>NULL</literal></link>.
403
The pointer array should be freed using <link linkend="g-free"><function>g_free()</function></link>.
406
</simpara></listitem></varlistentry>
407
</variablelist></refsect2>
408
<refsect2 id="g-ptr-array-foreach" role="function" condition="since:2.4">
409
<title>g_ptr_array_foreach ()</title>
410
<indexterm zone="g-ptr-array-foreach" role="2.4"><primary>g_ptr_array_foreach</primary></indexterm><programlisting><link linkend="void">void</link> g_ptr_array_foreach (<link linkend="GPtrArray">GPtrArray</link> *array,
411
<link linkend="GFunc">GFunc</link> func,
412
<link linkend="gpointer">gpointer</link> user_data);</programlisting>
414
Calls a function for each element of a <link linkend="GPtrArray"><type>GPtrArray</type></link>.</para>
417
</para><variablelist role="params">
418
<varlistentry><term><parameter>array</parameter> :</term>
419
<listitem><simpara> a <link linkend="GPtrArray"><type>GPtrArray</type></link>
420
</simpara></listitem></varlistentry>
421
<varlistentry><term><parameter>func</parameter> :</term>
422
<listitem><simpara> the function to call for each array element
423
</simpara></listitem></varlistentry>
424
<varlistentry><term><parameter>user_data</parameter> :</term>
425
<listitem><simpara> user data to pass to the function
426
</simpara></listitem></varlistentry>
427
</variablelist><para role="since">Since 2.4