| ... | ... | @@ -2929,9 +2929,15 @@ test "basic slices" { |
| 2929 | 2929 | // Both can be accessed with the `len` field. |
| 2930 | 2930 | var known_at_runtime_zero: usize = 0; |
| 2931 | 2931 | const slice = array[known_at_runtime_zero..array.len]; |
| 2932 | try expect(@TypeOf(slice) == []i32); |
| 2932 | 2933 | try expect(&slice[0] == &array[0]); |
| 2933 | 2934 | try expect(slice.len == array.len); |
| 2934 | 2935 | |
| 2936 | // If you slice with comptime-known start and end positions, the result is |
| 2937 | // a pointer to an array, rather than a slice. |
| 2938 | const array_ptr = array[0..array.len]; |
| 2939 | try expect(@TypeOf(array_ptr) == *[array.len]i32); |
| 2940 | |
| 2935 | 2941 | // Using the address-of operator on a slice gives a single-item pointer, |
| 2936 | 2942 | // while using the `ptr` field gives a many-item pointer. |
| 2937 | 2943 | try expect(@TypeOf(slice.ptr) == [*]i32); |
| ... | ... | @@ -2974,22 +2980,26 @@ test "using slices for strings" { |
| 2974 | 2980 | } |
| 2975 | 2981 | |
| 2976 | 2982 | test "slice pointer" { |
| 2983 | var a: []u8 = undefined; |
| 2984 | try expect(@TypeOf(a) == []u8); |
| 2977 | 2985 | var array: [10]u8 = undefined; |
| 2978 | 2986 | const ptr = &array; |
| 2987 | try expect(@TypeOf(ptr) == *[10]u8); |
| 2979 | 2988 | |
| 2980 | | // You can use slicing syntax to convert a pointer into a slice: |
| 2981 | | const slice = ptr[0..5]; |
| 2989 | // A pointer to an array can be sliced just like an array: |
| 2990 | var start: usize = 0; |
| 2991 | var end: usize = 5; |
| 2992 | const slice = ptr[start..end]; |
| 2982 | 2993 | slice[2] = 3; |
| 2983 | 2994 | try expect(slice[2] == 3); |
| 2984 | 2995 | // The slice is mutable because we sliced a mutable pointer. |
| 2985 | | // Furthermore, it is actually a pointer to an array, since the start |
| 2986 | | // and end indexes were both comptime-known. |
| 2987 | | try expect(@TypeOf(slice) == *[5]u8); |
| 2988 | | |
| 2989 | | // You can also slice a slice: |
| 2990 | | const slice2 = slice[2..3]; |
| 2991 | | try expect(slice2.len == 1); |
| 2992 | | try expect(slice2[0] == 3); |
| 2996 | try expect(@TypeOf(slice) == []u8); |
| 2997 | |
| 2998 | // Again, slicing with constant indexes will produce another pointer to an array: |
| 2999 | const ptr2 = slice[2..3]; |
| 3000 | try expect(ptr2.len == 1); |
| 3001 | try expect(ptr2[0] == 3); |
| 3002 | try expect(@TypeOf(ptr2) == *[1]u8); |
| 2993 | 3003 | } |
| 2994 | 3004 | {#code_end#} |
| 2995 | 3005 | {#see_also|Pointers|for|Arrays#} |