The What, How, and Why of Void Pointers in C and C++?

Jacob Sorber
19 Jul 202213:12

Summary

TLDRIn this educational video, the concept of void pointers is demystified for beginner programmers. The host explains that void pointers, which lack type information, essentially point to 'nothing' or rather, no specific type. They serve as a flexible way to store any memory address without making assumptions about the data it points to. The video illustrates void pointers' functionality with examples, including using them with memory allocation functions like malloc and free, which return and accept void pointers respectively. The host also highlights the difference in handling void pointers between C and C++, where C++ requires an explicit cast due to its stricter type safety. The aim is to clarify the use of void pointers and to help viewers overcome the initial confusion they might face when encountering them in programming.

Takeaways

  • 😀 The video is aimed at beginner programmers who are familiar with pointers but encounter confusion with void pointers.
  • 🔍 The term 'void' in programming is first encountered in the context of functions that do not return any value.
  • 🤔 A void pointer is a pointer that does not have type information, essentially a pointer to 'nothing' or 'no type'.
  • 📌 Void pointers are used to store any type of address without making assumptions about the data stored at that address.
  • 💡 The size of a void pointer is the same as any other pointer on a given system, as they all store addresses.
  • 🚫 You cannot directly dereference a void pointer because it lacks type information, but you can cast it to a specific pointer type to dereference it.
  • 🔧 Void pointers are useful in scenarios where you need to store generic memory addresses, such as with memory allocation functions like malloc.
  • 🛠️ Functions like malloc and free use void pointers because they are concerned with the size of the memory block rather than the type of data it holds.
  • 🔄 When using void pointers, it's important to cast them to the appropriate pointer type before dereferencing to avoid errors.
  • ⚠️ There is a difference in how C and C++ handle assigning void pointers to other pointer types, with C being more lenient and C++ requiring an explicit cast.

Q & A

  • What is the main topic discussed in the video?

    -The main topic discussed in the video is void pointers, their purpose, and how they are used in programming, particularly in C and C++.

  • What does the term 'void' signify in the context of a function?

    -In the context of a function, 'void' signifies that the function does not have a result type and does not produce a value upon completion.

  • What is a void pointer according to the video?

    -A void pointer is a pointer that does not have type information attached to it. It stores an address in memory without making any assumptions about what is stored at that location.

  • Why might someone want to use a void pointer?

    -One might want to use a void pointer when they want to store generic memory addresses without caring about the type of data those addresses point to.

  • How does the size of a void pointer compare to other pointers?

    -The size of a void pointer is the same as other pointers, as they all store an address in memory, which is typically the size of a memory address on the system (e.g., 8 bytes on the presenter's machine).

  • What is the issue with dereferencing a void pointer directly?

    -The issue with dereferencing a void pointer directly is that the compiler does not have type information, so it cannot perform operations on the data at the address the void pointer is storing.

  • How can a void pointer be made to work like a regular pointer?

    -A void pointer can be made to work like a regular pointer by casting it to a specific pointer type, which provides the necessary type information for the compiler to perform operations on the data.

  • What is the practical use of void pointers in memory allocation?

    -Void pointers are used in memory allocation functions like malloc, because these functions return a generic pointer to a block of memory without caring about the type of data that will be stored in it.

  • How does the video demonstrate the use of void pointers with malloc and free?

    -The video demonstrates assigning a void pointer to the result of malloc to dynamically allocate memory and then casting the void pointer to an int pointer before using it. It also shows passing a void pointer to the free function to deallocate memory.

  • What is the difference between how C and C++ handle assigning a void pointer to another pointer type?

    -C allows assigning a void pointer to another pointer type without a cast, while C++ requires an explicit cast to acknowledge the change from one pointer type to another, reflecting C++'s stronger type safety.

  • Why is it important to understand the difference between C and C++ when using void pointers?

    -Understanding the difference is important for writing portable code that works in both languages and for avoiding type-related bugs that can occur when pointers are not properly cast.

Outlines

00:00

📌 Introduction to Void Pointers

The video begins with an introduction to void pointers, which are pointers without type information. The concept can be confusing for beginner programmers, and the video aims to clarify this by explaining what a void pointer is and why one might use it. The host also mentions that viewers might have unknowingly used void pointers before. The video promises to discuss examples of void pointers and a subtle difference between C and C++ that could save viewers time. The host expresses gratitude to supporters and mentions Patreon as a way to access example code and monthly office hours.

05:00

🔍 Understanding Void Pointers and Their Size

This paragraph delves into the concept of void pointers, comparing them to regular pointers and explaining that they store addresses without any type information. The host uses the analogy of 'void' meaning 'no type' rather than 'nothing'. The video demonstrates that both void pointers and int pointers have the same size in memory, which is eight bytes on the host's machine. The host also shows that it is possible to assign the address stored in an int pointer to a void pointer, emphasizing that void pointers are still pointers that store addresses.

10:01

🚫 Limitations and Usage of Void Pointers

The host explains the limitations of void pointers, such as the inability to dereference them directly due to the lack of type information. However, this limitation can be overcome with type casting, which allows the programmer to treat a void pointer as if it were another type of pointer. The video provides an example of casting a void pointer to an int pointer and dereferencing it to store an integer value. The host also discusses practical uses of void pointers, such as in memory allocation with malloc and free, and in functions like memcpy, which do not require type information and work with raw memory addresses.

🛠️ Practical Examples and C vs. C++ Pointer Assignment

The video provides practical examples of using void pointers, including dynamic memory allocation with malloc and copying memory with memcpy. The host also discusses the difference between C and C++ in handling pointer assignments. In C, assigning a void pointer to an int pointer is allowed, while C++ requires an explicit cast to acknowledge the change in pointer types. The host emphasizes the importance of being aware of these differences and suggests including the cast for more portable code between the two languages.

Mindmap

Keywords

💡Pointers

Pointers are a fundamental concept in programming, particularly in languages like C and C++. They are variables that store the memory address of another variable. In the context of the video, pointers are the central theme, with a focus on 'void pointers', which are pointers that do not have type information. The script discusses how pointers work and their use in programming, especially when dealing with memory allocation and function calls.

💡Void Pointers

A 'void pointer' is a special type of pointer in C and C++ that can point to any data type. It is called 'void' because it lacks type information. The video explains that void pointers are used when the type of data being pointed to is not known or when dealing with generic memory addresses. An example from the script is when the speaker creates a void pointer and assigns it the address of an integer, demonstrating the flexibility of void pointers.

💡Type Information

Type information refers to the data type associated with a variable or pointer in programming. It tells the compiler what kind of data is being stored or manipulated. The video emphasizes that void pointers do not have type information, which means they can be assigned to point to any data type. However, when dereferencing a void pointer, a cast is often necessary to specify the intended data type.

💡Memory Allocation

Memory allocation in the context of the video refers to the process of dynamically reserving memory during the runtime of a program. Functions like 'malloc' in C are used for this purpose. The script explains that void pointers are often used in memory allocation because they can store any type of memory address, making them ideal for functions like 'malloc', which returns a generic pointer to the allocated memory.

💡Dereferencing

Dereferencing is the act of accessing the value at the memory address a pointer refers to. The video mentions that dereferencing a void pointer is not straightforward because it lacks type information. To dereference a void pointer, one must cast it to a specific data type, as shown when the speaker assigns a value to a void pointer by casting it to an integer pointer.

💡Casting

Casting in programming is the process of converting one data type to another. The video script uses casting to demonstrate how to work with void pointers by converting them to a specific pointer type before dereferencing. This is crucial when assigning values to or from void pointers, as seen when the speaker casts a void pointer to an integer pointer to store an integer value.

💡Function Result Type

In programming, the result type of a function is the data type that the function returns. The video introduces the concept of 'void' in the context of functions, explaining that a 'void function' is one that does not return any value. This is foundational to understanding void pointers, as the term 'void' is used to denote the absence of a data type.

💡Generic Memory Addresses

The term 'generic memory addresses' in the video refers to the use of void pointers to store any type of memory address without being tied to a specific data type. This is useful in scenarios like memory allocation and dynamic data structures where the exact data type is not relevant. The script illustrates this with examples of using void pointers with 'malloc' and 'memcpy'.

💡C vs. C++

The video script highlights the differences between the C and C++ programming languages, particularly in how they handle void pointers. C allows for more implicit casting between void pointers and other pointer types, while C++ requires explicit casting to ensure type safety. This difference is important for programmers to understand when writing code that is intended to be portable between the two languages.

💡Memory Size

The 'memory size' mentioned in the video refers to the amount of storage a pointer occupies in memory. The script includes an example where the speaker uses 'sizeof' to compare the size of a void pointer with that of an integer pointer, showing that on their machine, both pointers are 8 bytes in size, indicating that they both store an address regardless of the data type.

Highlights

Introduction to void pointers, which are pointers without type information.

Explanation of why void pointers might be used and their utility in programming.

Void functions in C and their meaning as functions without a result type.

Demonstration of a void function that prints 'hello' and the inability to assign its return value.

Introduction of the concept of a variable pointer to void, which points to no specific type.

Comparison of void pointers to regular pointers, emphasizing that they both store addresses.

Code example showing the size of void pointers and int pointers, highlighting their equivalence in memory size.

Assignment of an address value between a void pointer and an int pointer, demonstrating their interchangeability.

Explanation of the limitations of void pointers, such as the inability to dereference them without a cast.

Illustration of how to use a cast to dereference a void pointer and assign a value to it.

The subtle difference between C and C++ regarding void pointers and type casting.

Practical use case of void pointers in memory allocation with malloc and free functions.

Example of using memcpy, which utilizes void pointers for generic memory operations.

Discussion on the benefits of void pointers for storing generic memory addresses.

Code example demonstrating assigning malloc's result to both void and int pointers and the necessity of casting in C++.

Final thoughts on the importance of understanding void pointers for writing portable code between C and C++.

Encouragement for viewers to like, subscribe, and interact with the content for better visibility on YouTube.

Transcripts

play00:00

today i want to talk about pointers

play00:01

specifically pointers that don't have

play00:03

type information are also known as void

play00:05

pointers

play00:09

[Music]

play00:15

hey everybody welcome back today's video

play00:17

is for the beginners for fairly beginner

play00:20

programmers out there who think that

play00:21

you've finally wrapped your head around

play00:22

pointers but then you see something like

play00:25

this and you're not really sure what to

play00:26

make of it because this causes a serious

play00:28

moment of pause for a lot of beginners

play00:30

so i thought today we would talk about

play00:32

it talk about what a void pointer is why

play00:34

you might want to use one and we'll also

play00:36

talk about some examples where you may

play00:38

have already used a void pointer and you

play00:39

just didn't realize it also at the end

play00:41

i'm going to talk a little bit about a

play00:43

subtle difference between c and c plus

play00:44

plus might save you some time but first

play00:46

a big thank you to all of you who

play00:48

support this channel through patreon

play00:49

buying merch and online classes also for

play00:52

those of you that are curious about

play00:53

where you can get example code from my

play00:55

videos you can get that through patreon

play00:56

and you can get access to my monthly

play00:58

office hour so now back to void pointers

play01:00

if you look long enough into the void

play01:02

the void begins to look back through you

play01:04

i don't know if nietzsche was talking

play01:06

about new programmers but sometimes the

play01:07

concept of void takes a second to get a

play01:10

grip on now the first time you see void

play01:11

is probably when you are looking at a

play01:14

void function maybe something like this

play01:16

and we make a quick function and let's

play01:19

just say it's a simple function that

play01:20

prints out

play01:22

the word hello with a newline character

play01:24

nothing complicated about that so in

play01:26

this case the void simply says that this

play01:29

function does not have a result type it

play01:31

doesn't produce a result it doesn't give

play01:33

us a value when it's done so if i come

play01:35

down here in main i can definitely call

play01:38

say hello and this is going to work just

play01:41

fine now let's make sure just by coming

play01:43

down here and compiling with my make

play01:46

file i am using a make file you can

play01:48

check it out here nothing complicated

play01:50

just a really basic make file if you

play01:51

haven't seen make be sure to check it

play01:53

out on my other videos that deal with

play01:55

make and actually hold up really quick i

play01:57

just noticed i was editing my c plus

play01:59

example let's do this over in c and

play02:02

compile that one we'll come back to c

play02:03

plus plus later but if i run example

play02:06

here then you will see that it works

play02:08

just fine it prints out hello so no

play02:10

worries but note that i can't do

play02:12

something like this i can't say result

play02:15

equals say hello like this if i try to

play02:17

do this i'm going to get an error

play02:19

because it says hey look you're trying

play02:20

to assign to an integer a value void

play02:23

doesn't have any type information it's

play02:25

not a variable simply the compiler just

play02:27

doesn't know how to take nothing no

play02:29

variable no result and produce an int

play02:32

out of it so it gives us an error so

play02:34

hopefully that makes sense hopefully

play02:35

that's straightforward enough and i'll

play02:37

leave this up here but so what if what

play02:38

about if i come down here and say

play02:40

something like void star p we understand

play02:43

what it means for a function to be void

play02:44

mean it doesn't return anything but what

play02:46

does it mean to have a variable p which

play02:48

is a pointer that points to void which

play02:51

may be up till now we've thought of as

play02:52

nothing so is this a pointer to nothing

play02:55

okay so calm down calm down you see at

play02:57

least in this case it's probably more

play02:59

helpful to think of void as meaning no

play03:01

type rather than nothing so we can think

play03:03

of this as a pointer but we have no type

play03:05

information that is attached to that

play03:07

pointer so the compiler is storing an

play03:09

address for us in memory but it's not

play03:11

making any assumptions about what is

play03:13

stored at that location in memory but

play03:15

really what i want to emphasize is that

play03:16

it is still a pointer just like any

play03:18

other pointer it stores an address and

play03:20

just to make this clear what i want to

play03:22

do is to come down here and we'll just

play03:24

add a little bit to our program first

play03:25

thing i'm going to add an int pointer

play03:27

call this p2 or let's call this ip this

play03:30

might be the kind of pointer that you

play03:32

maybe were introduced to and let's come

play03:34

down here and add a couple printf

play03:36

statements we're going to say the size

play03:38

of a void pointer equals we'll do zu

play03:42

because we're using memory sizes good

play03:44

habit to get into and we'll do size of

play03:47

void pointer and then let's do the same

play03:49

thing with our int pointer so we'll do

play03:52

p right here i p right here and change

play03:57

this to be

play03:58

an int pointer okay so now we can

play04:00

compile it we can come down here and run

play04:02

it and you can see that both of these

play04:04

are the same size at least on my machine

play04:06

we're looking at eight bytes per pointer

play04:09

because they're both simply storing an

play04:10

address and on my machine an address is

play04:12

eight bytes and since these pointers are

play04:14

basically the same we can do something

play04:16

like i could say p equals ip right i can

play04:19

just assign one address value to another

play04:22

and just to see this in action let's

play04:24

come up here and we're gonna make let's

play04:26

make an integer we'll call it x and

play04:28

assign it to a value let's say it's

play04:30

speed beef and then i'm going to come

play04:32

down here and take my in pointer and

play04:34

assign it to the address of x now note

play04:37

that i could have just done the same

play04:39

thing with p i could say p equals the

play04:41

address of x that's going to work just

play04:43

fine too but let's not do that for right

play04:44

now we'll come to that later my point

play04:46

right now is that we have a value here

play04:48

and we should have an actual address

play04:51

being assigned to ip and then when we

play04:54

assign p to be ip we should end up with

play04:56

the same addresses so just to verify

play04:58

that let's come down here and get

play05:00

ourselves a another printf statement

play05:02

it's going to be p

play05:04

points to

play05:06

percent p if you haven't seen the

play05:08

percent p format specifier this is

play05:11

simply

play05:12

there for printing out addresses which

play05:14

is exactly what i want to do right now

play05:16

is i'm going to print out the address of

play05:17

p and the address of ip and now if we

play05:20

come down once again we compile it and

play05:22

if we run it you can see we get the same

play05:25

address for both pointers so i hope at

play05:27

this point it's making it clear that

play05:28

they're both pointers they're both

play05:29

storing an address in this case they're

play05:31

storing the exact same address so what's

play05:33

the difference well for one one

play05:35

difference is because we have type

play05:37

information around it i can come in here

play05:39

and i can say ip you know star iep i can

play05:42

de-reference it and say this equals

play05:44

something else like let's say

play05:47

coffee okay so this is going to store

play05:49

the integer coffee at the address that

play05:51

ip points to but i'm going to run into

play05:53

trouble if i try to do the same thing

play05:55

like so let's say i do star p equals and

play05:58

i give it its own value

play06:01

if i can type beef now this is going to

play06:03

give me a little bit of trouble if i

play06:05

come down here and try to compile it

play06:07

it's going to say hey wait a minute void

play06:09

is not assignable you can't assign

play06:11

something to void you have no type

play06:12

information here so the first thing you

play06:14

need to know about void pointers i guess

play06:16

is that you can't dereference them or at

play06:18

least you shouldn't de-reference them in

play06:19

general because you can't do much with

play06:21

void but of course this is only a minor

play06:23

inconvenience because as i mentioned in

play06:25

some previous videos c is not a type

play06:27

safe language so we can just add a cast

play06:29

in here and what i'm saying here with

play06:31

this cast is i'm saying i want you to

play06:33

treat p as though it were an in pointer

play06:36

and then dereference it and now with

play06:37

this added cast this line is now going

play06:40

to work just fine so again once more

play06:42

let's just double check let's make sure

play06:43

that this is actually working and we'll

play06:45

print out our

play06:46

contents we will add a

play06:49

percent x specifier because i'm going to

play06:51

print out in hexadecimal and we'll come

play06:53

down here and do star p

play06:57

and star ip

play06:59

once again i am going to need the cast

play07:01

because otherwise it would complain to

play07:03

me saying it doesn't know what to do

play07:04

with this void pointer

play07:06

and now we can come down and compile it

play07:08

and if we run it you can see that both

play07:11

of these memory addresses are pointing

play07:13

both of these addresses are pointing to

play07:15

the memory containing dead beef now

play07:17

let's pause here really quickly to make

play07:19

sure this all makes sense some of you

play07:20

may be wondering about what happened to

play07:23

coffee that i wrote up here in

play07:25

the location pointed to by ip and i did

play07:28

this on purpose because i wanted you to

play07:30

remember that these two pointers are at

play07:32

this time pointing to the same location

play07:34

in memory so the last write to the

play07:35

memory pointed to by p that overwrote

play07:39

the previous values in that memory and

play07:41

both pointers are pointing to the same

play07:42

thing so they only are showing the last

play07:44

thing that was written so just to

play07:45

illustrate this just to try to tease

play07:47

this apart let's now make them separate

play07:49

so instead of assigning p to be ip right

play07:52

here i'm going to take this out and

play07:54

let's come up here and make another int

play07:56

and y and i'm going to assign p to be

play07:59

the address of y so now with just that

play08:02

subtle change that very small change i

play08:04

can come down here and i can run it and

play08:06

now you can see that we have different

play08:08

addresses and different values because

play08:10

the two pointers are now pointing to two

play08:12

different locations okay so that's cool

play08:14

but why would we ever want to use a

play08:16

pointer with no type information it just

play08:18

seems like it makes more work because

play08:19

you have to keep casting things and it's

play08:21

just limiting right and the answer is

play08:23

that basically anytime you want to store

play08:25

generic memory addresses basically when

play08:28

you want to store an address but you

play08:29

don't really care what type it points to

play08:31

so one example that you're going to see

play08:33

a lot is when you use a memory allocator

play08:35

so let's say instead of assigning p up

play08:37

here to the address of why let's say we

play08:40

come in here and say malik's size of int

play08:44

so this is just saying hey i want you to

play08:46

dynamically allocate on the heap a block

play08:48

of memory that is integer sized and then

play08:50

we're going to assign it to p and then

play08:52

of course we should come down here at

play08:54

the end and free p once we're done with

play08:56

it and of course this would work with

play08:58

our ant pointer as well but let's just

play09:00

take a look before we get to all that

play09:02

let's just look at the man page for

play09:04

malik sorry and

play09:06

malek so this is showing us the malik

play09:09

and free man page we can see and of

play09:11

course calicryalic and realicarray but

play09:14

if you look closely here notice what

play09:16

malik returns when you ask for memory

play09:18

what you're doing is you're saying hey i

play09:20

want a certain size block of memory

play09:22

malik doesn't really care what you're

play09:24

going to put in that memory it just

play09:25

cares what size it is and it knows that

play09:27

you're not really going to care you just

play09:29

want the pointer back malik is trying to

play09:31

be generic so malik returns you avoid

play09:33

pointer and of course up here in our

play09:35

program we could use malik with a

play09:37

non-void pointer and we'll get to that

play09:38

in just a minute but but first before we

play09:40

finish with the man page if you look at

play09:42

free similarly when free when we're done

play09:45

with the memory and we're just trying to

play09:46

like give it up and let somebody else

play09:48

use it notice what we pass in we pass in

play09:50

a void pointer again because again free

play09:52

doesn't really care what types you put

play09:54

in that block it just wants to reclaim

play09:57

the block so just give me the address i

play09:59

don't care what's actually stored there

play10:01

another quick example just while we're

play10:02

looking at examples is

play10:05

mem copy which we looked at in a recent

play10:07

video that one involved an angry

play10:09

squirrel just in case you haven't

play10:10

checked it out but notice again here

play10:12

that mem copy is using void pointers and

play10:15

the reason is it doesn't care what you

play10:16

stored there it's just just give me an

play10:18

address i'm going to copy the memory i

play10:20

don't really care what it is i'm just

play10:21

going to copy bytes so again the point

play10:23

here is anytime that you're trying to

play10:25

work with an address a block of memory

play10:27

you want to store a pointer but you

play10:28

don't care what it actually points to

play10:31

then a void pointer is a really good

play10:32

option this will allow you to for

play10:34

example if i wanted an array of pointers

play10:36

and i wanted to have them each pointing

play10:37

to different things i could do that with

play10:39

void pointers so but now let's just

play10:42

tweak this a little bit let's get out of

play10:43

here and let's come in here and tweak

play10:46

things to make it work a little more how

play10:49

we usually do things in our programs

play10:51

because usually in a program if i knew

play10:53

that i wanted to have an int here i

play10:55

wouldn't have a void pointer assigned to

play10:58

the result from malik instead what i

play11:00

would do and let's just let's just swap

play11:01

these two so we'll have p be assigned to

play11:04

the address of x and we'll come down

play11:06

here and we will have the integer

play11:08

pointer now pointing to the or assigned

play11:10

to the result from malloc and i should

play11:12

come down here and free ip okay so now

play11:15

at this point i do have an unused

play11:17

variable we'll get rid of y really quick

play11:20

and if we come down now our example

play11:22

works just like it did before it doesn't

play11:24

really matter we we did change up the

play11:26

addresses so now ip is on the heap

play11:28

rather than p is on the heap but

play11:29

otherwise basically we got the same

play11:31

thing but the reason i bring this up is

play11:32

that this highlights a difference

play11:34

between c and c plus plus that i just

play11:36

want to point out so let's quickly just

play11:37

take this over to c plus plus and now if

play11:40

we compile it you notice that we have a

play11:42

problem you see when c

play11:45

saw me assign a void pointer coming from

play11:47

malik to an in pointer it was like cool

play11:49

people do that all the time that's what

play11:50

people do with malik but when c plus

play11:52

plus saw it it was like hey those aren't

play11:54

the same kind of pointer do you think

play11:56

they're aware of that you see c plus

play11:58

plus is a bit more of a worrier so in c

play12:00

plus plus we would have to come up here

play12:02

and add a cast to an integer pointer and

play12:04

now if we come down here it's going to

play12:06

compile just fine and in case you're

play12:08

wondering it will run just the same and

play12:10

i just want to make it clear here that

play12:12

i'm not saying that one of these

play12:14

approaches the c approach of the c plus

play12:16

approach is better than the other i do

play12:18

wish they would agree on one common way

play12:20

and do the same thing because it would

play12:22

mean a little bit less for us to keep

play12:24

track of in our heads but i really think

play12:25

this is just a reflection of the two

play12:27

languages individual personalities c

play12:29

over here is going to allow you to write

play12:31

slightly more concise code while c plus

play12:34

plus over here is going to force you to

play12:36

acknowledge when you assign a pointer of

play12:38

one type to a pointer of another type

play12:40

and that's not a bad thing because

play12:41

that's actually the cause that's the

play12:43

source of a lot of weird bugs the main

play12:45

thing is to be aware of it and if you're

play12:47

writing code that needs to be portable

play12:49

to both c and c plus plus then just

play12:52

include the cast right here that will

play12:53

create more portable code because c

play12:55

doesn't mind so he's happy with that

play12:57

cast but c plus requires it so thanks

play12:59

for looking into the void with me today

play13:01

i hope you learned something new please

play13:02

like subscribe go on a clicking spree

play13:05

just click on everything just to let the

play13:06

youtube algorithm know that there's

play13:08

something interesting going on here and

play13:09

until next week i'll see you later

Rate This

5.0 / 5 (0 votes)

Related Tags
C ProgrammingVoid PointersMemory AllocationType InformationC LanguagePointers TutorialDynamic MemoryProgramming ConceptsCode ExamplesC++ Differences